현재 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);
이 스크립트의 출력은 다음과 같이 될 것이다 : 당신이 작업을 등록있어 경우 현재 대상에 포함되지하지만
그것은 하나의 결함을 가지고 그들이 너무 세지. I 이러한 작업 추가 예를 들어
는 :
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