Могу ли я определить повторно используемую подпрограмму / функцию / метод в скрипте Cake? - PullRequest
1 голос
/ 17 мая 2019

Я пробую Торт (C # Make) .Пока что все примеры и документация содержат файл сценария, объявляющий весь его код внутри делегатов, например:

Task("Clean")
    .Does(() =>
{
    // Delete a file.
    DeleteFile("./file.txt");

    // Clean a directory.
    CleanDirectory("./temp");
});

Однако одна из причин, по которой я заинтересован в использовании Cake, - это возможность написания моегосоздавать сценарии аналогично тому, как я пишу код, поскольку сценарии используют DSL на основе C #.В эту возможность включена возможность разделения кода, который я использую, в методы (или функции / подпрограммы, независимо от используемой терминологии), чтобы я мог разделить проблемы и повторно использовать код.Например, я могу захотеть выполнить один и тот же набор шагов для нескольких SKU.

Хотя я понимаю, что могу создать свою собственную отдельную DLL с псевдонимами сценариев , я бы хотел избежатьнеобходимость перекомпилировать отдельный проект каждый раз, когда я хочу изменить эти биты общего кода при работе над сценарием сборки.Есть ли способ определить, встроенный в обычный файл build.cake, методы, которые все еще могут запускать псевдонимы Cake (например, DeleteFile) и которые могут сами вызываться из моих задач Cake?

1 Ответ

2 голосов
/ 18 мая 2019

Cake - это C #, поэтому вы можете создавать классы, методы, как в обычном C #

Т.е. объявить класс в файле с тортом

public class MyClass
{
    public void MyMethod()
    {

    }

    public static void MyStaticMethod()
    {

    }
}

и затем использовать его как скрипт

var myClass = new MyClass();

// Call instance method
myClass.MyMethod();

//Call static method
MyClass.MyStaticMethod();

Cake DSL основан на сценариях Roslyn, поэтому есть некоторые различия, код по существу уже в типе, поэтому вы можете объявить метод без класса для повторного использования

public void MyMethod()
{

}

и тогда он может быть вызван как глобальные методы

MyMethod();

Несколько ошибок, выполнение класса изменит область видимости, поэтому у вас не будет доступа к псевдонимам / контексту и глобальным методам.Вы можете обойти это, то есть передав ICakeContext в качестве параметра классу

public class MyClass
{
    ICakeContext Context { get; }
    public MyClass(ICakeContext context)
    {
        Context = context;
    }

    public void MyMethod()
    {
        Context.Information("Hello");
    }
}

, а затем использовать его следующим образом:

// pass reference to Cake context
var myClass = new MyClass(Context);

// Call instance method which uses an Cake alias.
myClass.MyMethod();

У вас могут быть методы расширения, но они не могут быть вкласс, пример:

public static void MyMethod(this ICakeContext context, string message)
{
    context.Information(message);
}


Context.MyMethod("Hello");
...