2016-08-04 71 views
4

我目前正在构建一个与teamcity进行交互的Cake构建脚本,并且我想提供进度消息。我可以轻松地报告任务名称,但我无法了解构建脚本中的进度。想想(“执行5中的任务1”)。Cake:构建脚本进度

有什么方法可以在构建脚本中找到进度?

回答

2

您可以利用TaskSetupTasks,它们在IScriptHost上全局提供并始终可用。

这下面的例子:

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

它有一个缺陷但如果你有注册的任务不是在当前的目标包括他们也会数一数。

例如,如果我添加这些任务:

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

总之,你想要什么可以利用来实现:

  • Setup任务来计算可通过使用递归函数给出目标Tasks,存储结果全球可用变量。
  • TaskSetup显示您的消息
+0

谢谢,我已经走了后一种解决方案。 – Sebazzz