有条件地加载.cake文件

时间:2017-10-09 14:08:38

标签: cakebuild

我使用CAKE 0.22.0。

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

查看the CAKE page on preprocessor directives,我看不到有关预处理器关键字的任何信息,例如#if#else

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

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

1 个答案:

答案 0 :(得分:5)

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

你可以做的是创建一个小的bootstrapper蛋糕脚本,它可以提取你特定场景所需的部分。

使用CakeExecuteExpression的示例

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(
                        "\r\n",
                        statements
                        ),
                    currentDir
                    );

CakeExecuteExpression(
    expression
);

对于上面,如果参数VisualStudioVersion设置为2017或没有指定参数,那么它将加载

  • common.cake
  • vs2017.cake

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

  • common.cake
  • vs2013.cake

使用CakeExecuteScript的示例

也许不那么复杂只是提供给不同的入口点,即build.cake文件调用vs2013.cakevs2017.cake,具体取决于参数。

common.cake

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

vs2013.cake

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

vs2017.cake

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

build.cake

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年产出

cake .\executescript.cake

将输出

This will execute regardless version!

Hello VS2017!

2013年产出

cake .\executescript.cake --VisualStudioVersion=2013

将输出

This will execute regardless version!

Hello VS2013!