{-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:45:02 25 4
gpt4 key购买 nike

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

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 任务中调用它们自己?

最佳答案

Cake 是 C#,因此您可以像在常规 C# 中一样创建类、方法

IE。在蛋糕文件中声明一个类

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");

关于cakebuild - 我可以在 Cake 脚本中定义可重用的子例程/函数/方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56193495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com