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

5

我正在尝试使用 Cake (C# Make)。到目前为止,所有的示例和文档都是将脚本文件中的代码全部声明在委托内部,就像这样:

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

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

然而,我对使用Cake的兴趣之一是可以使用基于C#的DSL编写构建脚本,就像编写代码一样。这种可能性包括将我使用的代码分离成方法(或函数/子程序,适当的术语),以便我可以分离关注点并重用代码。例如,我可能希望为多个SKU运行相同的步骤集。
虽然我意识到我可以使用脚本别名创建自己的独立DLL,但我想避免在工作构建脚本时每次更改这些共享代码时重新编译单独的项目。是否有一种方法可以定义与普通的build.cake文件内联的方法,这些方法仍然可以运行Cake别名(例如DeleteFile),并且可以从我的Cake任务中调用?
1个回答

12

蛋糕是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作为参数传递给类来解决这个问题。

一些需要注意的问题:使用类会改变作用域,因此您将无法访问别名/上下文和全局方法。您可以通过将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");

这个函数能否在另一个文件中声明(以保持整洁,或者能够从另一个蛋糕脚本中重用它)? - lonix
1
是的,可以使用 #load 指令来实现。https://cakebuild.net/docs/writing-builds/preprocessor-directives/load - devlead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接