Cake 脚本 Alias / Addin 的最基本示例是什么?

What's bare minimum example of and Cake script Alias / Addin?

我正在查看为 Cake 创建我自己的插件以扩展 DSL,文档有点缺乏。

创建 Cake 插件脚本别名的最低要求是什么?

插件只是打包为 NuGet 程序包的常规 .NET 程序集,事实上,通常您可以引用几乎任何 .NET 程序集。

别名在常规程序集之外增加了什么:

  • 向 Cake DSL 添加方法,使其在 Cake 脚本中全局可用
  • 命名空间导入(无需 using 语句即可使类型可用)
  • 访问蛋糕核心classes/features

最小别名实现是扩展 Cake.Core.ICakeContext which has the Cake.Core.Annotations.CakeAlias 属性的扩展方法。

所以最小的实现是,创建一个 .NET 程序集,添加对 Cake.Core nuget 包的引用并添加一个 class,如下所示:

public static class HelloWorldAliases
{
        [CakeMethodAlias]
        public static void HelloWorld(this ICakeContext context)
        {
             context.Log.Information("Hello {0}", "World");
        }
}

要测试别名,您可以通过 #reference directive or if you packaged it via the #addin 指令加载程序集。
然后,您可以使用 HelloWorld() 在脚本中调用您的别名,ICakeContext 可以省略,因为它由 Cake 核心引擎自动提供。

示例"HelloWorld"蛋糕脚本:

#reference "HelloWorld.dll"
HelloWorld();

如果您有任何要为用户自动导入的命名空间,则可以使用扩展方法的 CakeNamespaceImport 属性来实现,例如:

public static class HelloWorldAliases
{
        [CakeMethodAlias]
        [CakeNamespaceImport("MyNameSpace.Common")]
        public static void HelloWorld(this ICakeContext context)
        {
             context.Log.Information("Hello {0}", "World");
        }
}

现在可以使用 MyNameSpace.Common 中的任何类型,而无需向脚本添加 using MyNameSpace.Common

打包插件并发布到 nuget 后,您可以使用 #addin 指令通过包 ID 引用它,示例:

#addin "HelloWorld"
HelloWorld();