Торт: Прогресс сборки скрипта

В настоящее время я создаю сценарий сборки Cake с взаимодействием с teamcity, и я хотел бы предоставить сообщения о ходе выполнения. Я могу легко сообщить название задачи, но не могу узнать, каков прогресс в сценарии сборки. Думайте как («выполнение задачи 1 из 5»).

Есть ли способ найти прогресс в скрипте сборки?


person Sebazzz    schedule 04.08.2016    source источник


Ответы (1)


Вы можете использовать TaskSetup и Задачи, которые доступны глобально на 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(()=>{});

Вывод 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);

Вывод этого скрипта будет следующим: Вывод сценария торта

Подводя итог, то, что вы хотите, может быть достигнуто с использованием:

  • Задача Setup для подсчета Задачи, доступные для данной цели, с использованием рекурсивной функции, сохраняющей результат в глобально доступной переменной.
  • TaskSetup для отображения вашего сообщения.
person devlead    schedule 04.08.2016
comment
Спасибо, я выбрал последнее решение. - person Sebazzz; 09.08.2016