我可以在我的 Cake 构建脚本中获取对当前 ICakeContext 的引用吗?

Can I get a reference to the current `ICakeContext` in my Cake build script?

我正在重构一个 Cake 构建脚本,并决定引入一个 class 来保存一些构建设置,这些设置在全局范围内经常被传递 and/or。

一些设置来自参数,并使用 Argument<T>(string name, string defaultValue) 语法设置。

我想创建这样的东西:

var context = BuildContext.FromArguments();

为此,我需要获取当前 ICakeContext 的一个实例。我认为这样做的原因是蛋糕脚本中定义的所有方法都成为自定义 ICakeContext 的方法,它可能继承自 CakeContext 因此可以调用它的所有(扩展)方法,但是一旦你定义一个 class,它变成一个嵌套的 class,不再可以访问像 Argument<T>(name, defaultValue).

这样的好帮手

我希望我可以做 ICakeContext.Current 或者像 BuildContext.FromArguments(this) 或类似的东西那样简单地传递 this

但是关键字 this 在 Cake 脚本的那个级别是不允许的(不知道为什么,顶层是静态方法吗?

所以,问题是:如何获得对当前 ICakeContext 的引用?

this 不起作用的原因是 Roslyn 实现脚本的方式,并且在脚本的外部范围内没有 this 的概念。

您可以通过几种不同的方式访问上下文。

来自Task:

Task("MyTask")
  .Does(ctx =>
{
    BuildContext.FromArguments(ctx);
});

来自Setup/Teardown:

Setup(ctx =>
{
    BuildContext.FromArguments(ctx);
});

Teardown(ctx =>
{
    BuildContext.FromArguments(ctx);
});

来自TaskSetup/TaskTeardown:

TaskSetup(ctx =>
{
    BuildContext.FromArguments(ctx);
});

TaskTeardown(ctx =>
{
    BuildContext.FromArguments(ctx);
});

来自外部脚本范围:

#load "somefile.csx"

BuildContext.FromArguments(Context);