4
我目前正在构建一个与teamcity进行交互的Cake构建脚本,并且我想提供进度消息。我可以轻松地报告任务名称,但我无法了解构建脚本中的进度。想想(“执行5中的任务1”)。Cake:构建脚本进度
有什么方法可以在构建脚本中找到进度?
我目前正在构建一个与teamcity进行交互的Cake构建脚本,并且我想提供进度消息。我可以轻松地报告任务名称,但我无法了解构建脚本中的进度。想想(“执行5中的任务1”)。Cake:构建脚本进度
有什么方法可以在构建脚本中找到进度?
您可以利用TaskSetup和Tasks,它们在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);
它有一个缺陷但如果你有注册的任务不是在当前的目标包括他们也会数一数。
例如,如果我添加这些任务:
Task("E")
.Description("Echo")
.Does(()=>{});
Task("F")
.Description("Foxtrot")
.Does(()=>{});
任务图表是内部的,尽管不是最佳的(但更正确的),你可以自己走自己的依赖关系图并计算出有多少独特的任务,例如:
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);
这个脚本的
总之,你想要什么可以利用来实现:
谢谢,我已经走了后一种解决方案。 – Sebazzz