2016-08-04 17 views
4

Ich baue gerade ein Cake-Build-Skript mit Interaktion zu Teamcity und ich möchte Fortschrittsnachrichten bereitstellen. Ich kann den Namen der Aufgabe leicht melden, aber ich bin nicht in der Lage herauszufinden, was der Fortschritt innerhalb des Build-Skripts ist. Denke wie ("Ausführen von Aufgabe 1 von 5").Kuchen: Build-Skript Fortschritt

Gibt es eine Möglichkeit, den Fortschritt innerhalb des Build-Skripts zu finden?

Antwort

2

Sie könnten TaskSetup und Tasks verwenden, die global auf der IScriptHost bereitgestellt werden und immer verfügbar sind.

Ein Beispiel hierfür unter:

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

Die Ausgabe dieses Skripts würde wie unten sein: Cake Script Output

Es wenn ein Fehler bekam ist, wenn Sie Aufgaben registriert habe sie nicht im aktuellen Ziel enthalten werde auch zählen.

Zum Beispiel, wenn ich diese Aufgaben hinzufügen:

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

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

Output Tasks.Count 6 sein und die Ausgabe wie folgt sein: Cake Build Script Output 6 Tasks

Task-Graph ist intern, wenn auch nicht optimal (aber mehr korrekt), könnten Sie möglicherweise das Abhängigkeitsdiagramm selbst laufen und zählen, wie viele einzigartige Aufgaben gibt es, Beispiel dafür:

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

Ausgabe dieses Skripts wäre: Cake script output

Um zusammenzufassen, was Sie können verwendet werden, erreicht werden soll:

  • Setup Aufgabe Tasks verfügbar eine rekursive Funktion, die von bestimmten Ziel zählen mit zu speichern Ergebnis in global verfügbare Variable.
  • TaskSetup Ihre Nachricht
+0

Dank anzuzeigen, habe ich mit dieser Lösung gegangen. – Sebazzz