关于 cakebuild:有条件地加载 .cake 文件

Conditionally load .cake files

我使用 CAKE 0.22.0.

根据传递给 build.cake 的参数,我想加载不同的 .cake 文件。例如,如果参数 VisualStudioVersion 的值为 2013,我想加载 vs2013dlls.cake 文件;如果它的值为 2015,那么我想加载 vs2015dlls.cake 文件;等等

查看预处理器指令的 CAKE 页面,我没有看到任何关于预处理器关键字的信息,例如 #if#else

我不希望将其他 .cake 文件的内容复制到 build.cake 中,以免 build.cake 变得过于臃肿。

如何有条件地加载 .cake 文件?


目前在加载脚本时不支持条件,如果支持,0.23.0 将添加 if def 支持,但预处理器指令被处理为相同级别/优先级,因此对您的特定问题没有帮助。

您可以做的是创建一个小的引导程序蛋糕脚本,用于提取特定场景所需的部分。

使用 CakeExecuteExpression 的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var visualStudioVersion = Argument("VisualStudioVersion","2017");
var statements = new List<string>();
var currentDir = MakeAbsolute(Directory("./"));

statements.Add("#load "{0}/common.cake"");
switch(visualStudioVersion)
{
    case"2013":
        statements.Add("#load "{0}/vs2013.cake"");
        break;
    case"2017":
        statements.Add("#load "{0}/vs2017.cake"");
        break;
    default:
    throw new Exception(string.Format("Unknown VisualStudioVersion: {0}", visualStudioVersion));
}

var expression = string.Format(
                    string.Join(
                       "\
\
",
                        statements
                        ),
                    currentDir
                    );

CakeExecuteExpression(
    expression
);

如果参数 VisualStudioVersion 设置为 2017 或未指定参数,那么它将加载

  • 普通蛋糕
  • vs2017.cake

如果参数 VisualStudioVersion 设置为 2013 那么它将加载

  • 普通蛋糕
  • vs2013.cake

使用 CakeExecuteScript 的示例

也许不太复杂的是只提供不同的入口点,即根据参数有一个 build.cake 文件调用 vs2013.cakevs2017.cake

普通蛋糕

1
Information("This will execute regardless version!") ;

vs2013.cake

1
2
#load"common.cake"
Information("Hello VS2013!");

vs2017.cake

1
2
#load"common.cake"
Information("Hello VS2017!");

构建蛋糕

1
2
3
4
5
6
7
8
9
10
11
12
13
var visualStudioVersion = Argument("VisualStudioVersion","2017");

switch(visualStudioVersion)
{
    case"2013":
        CakeExecuteScript("vs2013.cake");
        break;
    case"2017":
        CakeExecuteScript("vs2017.cake");
        break;
    default:
    throw new Exception(string.Format("Unknown VisualStudioVersion: {0}", visualStudioVersion));
}

2017年产出

1
cake .\\executescript.cake

将输出

This will execute regardless version!

Hello VS2017!

2013年产出

1
cake .\\executescript.cake --VisualStudioVersion=2013

将输出

This will execute regardless version!

Hello VS2013!