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



我正在尝试蛋糕(c#make(。到目前为止

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

但是,我有兴趣使用Cake的原因之一是,由于脚本使用基于C#的DSL,因此可能以类似的方式编写构建脚本。这种可能性中包括我将代码分离为方法(或函数/子例程,无论术语是否合适(的能力,因此我可以将问题分开并重复使用代码。例如,我可能想为多个SKU运行相同的步骤。

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

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

蛋糕DSL基于罗斯林(Roslyn(脚本,因此存在一些差异,代码本质上已经存在于类型中,因此您可以在不用类的情况下声明方法

public void MyMethod()
{
}

,然后可以像全局方法

一样称呼它
MyMethod();

一些陷阱,上课会更改范围,因此您无法访问别名/上下文和全局方法。您可以通过将icakeContext作为class

的参数来解决这个问题。
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");

最新更新