我正在重构一个Cake构建脚本,并决定引入一个类来保存一些可以在全局范围内传递和/或存在的构建设置.
一些设置来自参数,并使用Argument<T>(string name, string defaultValue)语法设置.
我想创建这样的东西:
var context = BuildContext.FromArguments();
Run Code Online (Sandbox Code Playgroud)
为此,我需要获取当前ICakeContext的一个实例.我相信的原因是,蛋糕脚本中定义的所有方法都成为ICakeContext可能继承自定义的方法,CakeContext因此可以调用它的所有(扩展)方法,但是一旦定义了类,它就变成了一个嵌套类,再也无法获得好帮手了Argument<T>(name, defaultValue).
我希望我可以做任何ICakeContext.Current或简单地传递this在BuildContext.FromArguments(this)或类似的东西.
但是在thisCake脚本的那个级别不允许使用关键字(不确定为什么,顶级是静态方法?
所以,问题是:我如何得到当前的参考ICakeContext?
Pat*_*son 13
this不起作用的原因是因为Roslyn实现脚本的方式,并且this脚本的外部范围没有概念.
您可以通过几种不同的方式访问上下文.
来自Task:
Task("MyTask")
.Does(ctx =>
{
BuildContext.FromArguments(ctx);
});
Run Code Online (Sandbox Code Playgroud)
来自Setup/ Teardown:
Setup(ctx =>
{
BuildContext.FromArguments(ctx);
});
Teardown(ctx =>
{
BuildContext.FromArguments(ctx);
});
Run Code Online (Sandbox Code Playgroud)
来自TaskSetup/ TaskTeardown:
TaskSetup(ctx =>
{
BuildContext.FromArguments(ctx);
});
TaskTeardown(ctx =>
{
BuildContext.FromArguments(ctx);
});
Run Code Online (Sandbox Code Playgroud)
从外部脚本范围:
#load "somefile.csx"
BuildContext.FromArguments(Context);
Run Code Online (Sandbox Code Playgroud)