将CakeContext传递给另一个.cake文件

时间:2017-09-29 09:02:45

标签: c# cakebuild

我使用CAKE 0.21.1.0。

我的build.cake脚本加载了另一个.cake脚本:tests.cake

tests.cake中,我有一个名为TestRunner的班级。 TestRunner有一个名为RunUnitTests()的方法,它使用VSTest方法provided by CAKE执行单元测试。

build.cake中,我创建了几个TestRunner的实例。每当我在任何一个实例上调用RunUnitTests()方法时,我都会看到以下错误消息:

error CS0120: An object reference is required for the non-static field, method, or property 'VSTest(IEnumerable<FilePath>, VSTestSettings)'

我认为这是因为我需要在VSTestCakeContext的显式实例上调用tests.cake

我的问题是:如何确保我的tests.cake脚本与CakeContext脚本共享相同的build.cake实例?如何让tests.cake编译?

修改

在回复devlead's reply时,我决定添加更多信息。

我按照了devlead的建议,将我的RunUnitTests()方法签名更改为:

public void RunUnitTests(ICakeContext context)

build.cake中,我的一项任务执行以下操作:

TestRunner testRunner = TestRunnerAssemblies[testRunnerName];
testRunner.RunUnitTests(this);

其中TestRunnerAssembliestests.cake中的只读字典,testRunnerName是先前定义的变量。 (在build.cake中,我插入了#l "tests.cake"。)

现在我看到此错误消息:

error CS0027: Keyword 'this' is not available in the current context

我做错了什么?

修改

没关系,我需要学习如何仔细阅读。我没有传入this,而是传递了Context,正如devlead最初建议的那样。现在可以毫无问题地调用RunUnitTests方法。

1 个答案:

答案 0 :(得分:3)

如果RunUnitTests()是静态方法,或者在类中,您需要将上下文作为参数传递给它RunUnitTests(ICakeContext context),因为它的范围不同。

然后你可以执行别名作为该方法的扩展。

示例:

RunUnitTests(Context);

public static void RunUnitTests(ICakeContext context)
{
    context.VSTest(...)
}

课程示例:

Task("Run-Unit-Tests")
    .Does(TestRunner.RunUnitTests);

RunTarget("Run-Unit-Tests");


public static class TestRunner
{
    public static void RunUnitTests(ICakeContext context)
    {
        context.VSTest("./Tests/*.UnitTests.dll");
    }
}