2016-08-04 19 views
4

私は現在、teamcityとの対話を含むCakeビルドスクリプトを作成しています。進捗メッセージを提供したいと思います。私はタスク名を簡単に報告することができますが、ビルドスクリプト内の進捗状況を知ることができません。 「5のタスク1を実行する」のように考えてください。Cake:ビルドスクリプトの進捗状況

ビルドスクリプト内で進捗状況を確認する方法はありますか?

答えて

2

IScriptHostには常に提供され、常に利用可能なTaskSetupTasksを利用できます。

下記の本の例:

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); 

このスクリプトの出力は以下のようになります: Cake Script Output

あなたが登録したタスクを得た場合、彼らは現在のターゲットに含まれていないが、それは、1つの欠陥を持っています数えます。例えば

、私はこれらのタスクを追加した場合:

Task("E") 
    .Description("Echo") 
    .Does(()=>{}); 

Task("F") 
    .Description("Foxtrot") 
    .Does(()=>{}); 

出力Tasks.Countは6になり、出力は次のようになります。 Cake Build Script Output 6 Tasks

タスクグラフは内部、いえませんが最適である(が、より正確な)、あなたは潜在的に依存グラフを歩いていくことができ、そこにいくつの固有のタスクがあるかを数えます。

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); 
このスクリプトの

出力は次のようになります。 Cake script output

を要約すると、あなたが利用して達成することができます欲しいもの:に結果を格納し、再帰関数を使用して、指定されたターゲットによるTasksが利用可能にカウントする

  • Setupタスクをグローバルに利用可能な変数。
  • TaskSetup
  • があなたのメッセージ
+0

感謝を表示するために、私は後者の溶液を用いて行ってきました。 – Sebazzz

関連する問題