我能在我的Cake构建脚本中获取当前的`ICakeContext`参考吗?

8
我正在重构一个Cake的构建脚本,并决定引入一个类来保存一些构建设置,这些设置在很多地方都会使用到,或者存在于全局作用域中。
其中一些设置来自于参数,并使用Argument<T>(string name, string defaultValue)语法进行设置。
我想创建如下的内容:
var context = BuildContext.FromArguments();

为此,我需要获取当前ICakeContext的实例。我认为这样做的原因是,所有在cake脚本中定义的方法都成为自定义的ICakeContext的方法,该ICakeContext可能从CakeContext继承并因此可以调用其(扩展)方法,但是一旦定义了一个类,它就变成了一个嵌套类,不再具有像Argument<T>(name, defaultValue)这样的好帮手。
我希望我可以使用ICakeContext.Current或只需传递this,如BuildContext.FromArguments(this)或类似的东西。
但是关键字this在Cake脚本的那个层级不被允许(不确定为什么,是顶层是静态方法吗?)
所以问题是:如何获取对当前ICakeContext的引用?
1个回答

18
< p > 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);

9
为什么会有踩票?因为我用Cake写的代码,我非常确定它是正确的... - Patrik Svensson

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