2016-08-04 2 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

그것은 하나의 결함을 가지고 그들이 너무 세지. I 이러한 작업 추가 예를 들어

는 :

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