我可以在Cake脚本中定义可重用的子例程/函数/方法吗?

时间:2019-05-17 20:58:22

标签: cakebuild

我正在尝试Cake (C# Make)。到目前为止,所有示例和文档都具有脚本文件,该脚本文件在委托中声明了其所有代码,如下所示:

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

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

但是,我对使用Cake感兴趣的原因之一是有可能以与编写代码类似的方式编写构建脚本,因为脚本使用基于C#的DSL。这种可能性包括将我使用的代码分离为方法(或函数/子例程,无论使用哪种合适的术语)的能力,以便我可以分离关注点并重用代码。例如,我可能要对多个SKU运行相同的步骤。

尽管我意识到我可以使用Script Aliases创建自己的单独的DLL,但我想避免每次在构建脚本中更改共享代码的这些位时都不得不重新编译一个单独的项目。有没有一种方法可以与普通build.cake文件内联地定义仍然可以运行Cake别名(例如DeleteFile)并且可以从我的Cake任务中调用的方法?

1 个答案:

答案 0 :(得分:1)

蛋糕是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");