我正在重构一个Cake构建脚本,并决定引入一个类来保存一些构建设置,这些构建设置可以在全局范围内传递和/或存在。
某些设置来自参数,并使用Argument<T>(string name, string defaultValue)
语法设置。
我想创建这样的东西:
var context = BuildContext.FromArguments();
为此,我需要获取当前ICakeContext的一个实例。我相信的原因是,蛋糕脚本中定义的所有方法都成为自定义构建的ICakeContext
的方法,可能继承自CakeContext
,因此可以调用其所有(扩展)方法,但是一旦你定义一个类,它成为一个嵌套类,不再能访问Argument<T>(name, defaultValue)
这样的好帮手。
我希望我可以ICakeContext.Current
或者只是传递this
BuildContext.FromArguments(this)
或类似的东西。
但是在Cake脚本的那个级别不允许使用关键字this
(不确定为什么,顶级是静态方法?
所以,问题是:如何获得对当前ICakeContext
?
答案 0 :(得分:11)
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);