有条件地加载 .cake 文件
Conditionally load .cake files
我使用 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
个文件?
目前在加载脚本时不支持条件语句,0.23.0 将添加 if def 支持,但预处理器指令的处理方式相同 level/priority,因此对您的具体问题没有帮助。
你可以做的是创建一个小的 bootstrapper cake 脚本,其中包含你的特定场景所需的部分。
使用 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.cake
或 vs2017.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!
我使用 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
个文件?
目前在加载脚本时不支持条件语句,0.23.0 将添加 if def 支持,但预处理器指令的处理方式相同 level/priority,因此对您的具体问题没有帮助。
你可以做的是创建一个小的 bootstrapper cake 脚本,其中包含你的特定场景所需的部分。
使用 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.cake
或 vs2017.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!