私は現在、teamcityとの対話を含むCakeビルドスクリプトを作成しています。進捗メッセージを提供したいと思います。私はタスク名を簡単に報告することができますが、ビルドスクリプト内の進捗状況を知ることができません。 「5のタスク1を実行する」のように考えてください。Cake:ビルドスクリプトの進捗状況
ビルドスクリプト内で進捗状況を確認する方法はありますか?
私は現在、teamcityとの対話を含むCakeビルドスクリプトを作成しています。進捗メッセージを提供したいと思います。私はタスク名を簡単に報告することができますが、ビルドスクリプト内の進捗状況を知ることができません。 「5のタスク1を実行する」のように考えてください。Cake:ビルドスクリプトの進捗状況
ビルドスクリプト内で進捗状況を確認する方法はありますか?
IScriptHostには常に提供され、常に利用可能なTaskSetupとTasksを利用できます。
下記の本の例:
string target = "A";
int taskCounter = 0;
TaskSetup(
taskSetupContext => {
ICakeTaskInfo task = taskSetupContext.Task;
Information("Executing Task {0} of {1} (Name: {2}, Description: {3}, Dependencies: {4})",
++taskCounter,
Tasks.Count,
task.Name,
task.Description,
string.Join(",",
task.Dependencies
)
);
});
Task("A")
.Description("Alpha")
.IsDependentOn("B")
.Does(()=>{});
Task("B")
.Description("Beta")
.IsDependentOn("C")
.Does(()=>{});
Task("C")
.Description("Charlie")
.IsDependentOn("D")
.Does(()=>{});
Task("D")
.Description("Delta")
.Does(()=>{});
RunTarget(target);
あなたが登録したタスクを得た場合、彼らは現在のターゲットに含まれていないが、それは、1つの欠陥を持っています数えます。例えば
、私はこれらのタスクを追加した場合:
Task("E")
.Description("Echo")
.Does(()=>{});
Task("F")
.Description("Foxtrot")
.Does(()=>{});
出力Tasks.Count
は6になり、出力は次のようになります。
タスクグラフは内部、いえませんが最適である(が、より正確な)、あなたは潜在的に依存グラフを歩いていくことができ、そこにいくつの固有のタスクがあるかを数えます。
string target = "A";
int taskCounter = 0;
int taskCount = 0;
Setup(context => {
// declare recursive task count function
Func<string, List<string>, int> countTask = null;
countTask = (taskName, countedTasks) => {
if (string.IsNullOrEmpty(taskName) || countedTasks.Contains(taskName))
{
return 0;
}
countedTasks.Add(taskName);
var task = Tasks.Where(t=>t.Name == taskName).FirstOrDefault();
if (task == null)
{
return 0;
}
int result = 1;
countedTasks.Add(taskName);
foreach(var dependecy in task.Dependencies)
{
result+=countTask(dependecy, countedTasks);
}
return result;
};
// count the task and store in globally available variable
taskCount = countTask(target, new List<string>());
});
TaskSetup(
taskSetupContext => {
ICakeTaskInfo task = taskSetupContext.Task;
Information("Executing Task {0} of {1} (Name: {2}, Description: {3}, Dependencies: {4})",
++taskCounter,
taskCount,
task.Name,
task.Description,
string.Join(",",
task.Dependencies
)
);
});
Task("A")
.Description("Alpha")
.IsDependentOn("B")
.Does(()=>{});
Task("B")
.Description("Beta")
.IsDependentOn("C")
.Does(()=>{});
Task("C")
.Description("Charlie")
.IsDependentOn("D")
.Does(()=>{});
Task("D")
.Description("Delta")
.Does(()=>{});
Task("E")
.Description("Echo")
.Does(()=>{});
Task("F")
.Description("Foxtrot")
.Does(()=>{});
RunTarget(target);
このスクリプトの
を要約すると、あなたが利用して達成することができます欲しいもの:に結果を格納し、再帰関数を使用して、指定されたターゲットによるTasksが利用可能にカウントする
感謝を表示するために、私は後者の溶液を用いて行ってきました。 – Sebazzz