2017-10-16 35 views
1

我正在使用Cake 0.23.0,很高兴地看到任务依赖关系已被扩展。不幸的是,似乎即使是最新版本也不能解决我的问题。 或者我只是做错了什么?在Cakebuild中创建任务序列

我想达成什么

  • 假如我有相等多种平台(如x86或x64)定义的任务
  • 我想定义首先是一个生成序列为x86平台执行所有任务。一旦完成一个初始化任务应该被执行,只是将平台设置为x64,然后应该执行与x86一样的任务。
  • 实施例序列: 任务初始化86 - >任务A - >任务B - >任务C - >任务初始化64 - >任务A - >任务B - >任务C

当前行为 由此产生的序列是 任务初始化x86 - >任务A - >任务B - >任务C - >任务初始化x64

看来,Cake一次只遵守任务依赖关系。我已经定义它像图所示:

Task("Compile-All-Platforms") 
    .IsDependentOn("Init-86") 
    .IsDependentOn("A") 
    .IsDependentOn("B") 
    .IsDependentOn("C") 
    .IsDependentOn("Init-x64") 
    .IsDependentOn("A") 
    .IsDependentOn("B") 
    .IsDependentOn("C"); 

回答

1

如果你想建立在两个大的步骤,用简单的方式做这将是封装A,B和C的构建逻辑的辅助功能,然后将它们包装在x86或x64任务中。这里的想法是利用Cake可以为您创建的依赖关系树,而不是写下Compile-All中的所有依赖关系。实际上,这是你想要使用构建协调器的主要原因。当然,这是一种简单的方法,可以使它适用于3个任务和2个平台。一个更具可扩展性的解决方案是创建和插入一个接受“平台”参数并构建N个项目的助手脚本。

请注意,下面的代码仅显示如何获得您所要求的操作,但需要根据适当的WithCriteria指令进行改进。如果按照原样进行操作,您将无法仅构建x64。

Task("Compile-x86"){ 
    BuildA(); 
    BuildB(); 
    BuildC(); 
}; 

Task("Init-x64") 
    .IsDependentOn("Compile-x86"){ 
    //Your init code goes here 
}; 

Task("Compile-x64") 
    .IsDependentOn("Init-x64"){ 
    BuildA(); 
    BuildB(); 
    BuildC(); 
}; 

Task("Compile-All-Platforms") 
.IsDependentOn("Compile-x64"); 
+0

你好雷诺, 谢谢你的回答。我想我可以尽量减少任务和功能的数量。基本上这些功能可以完成我需要的工作。 我建议改进文档,因为对于我来说,直到遇到麻烦时才明确表示C#Make的行为如此。 –

+0

......另一件重要的事情应该在新手文档中更好地突出显示:如果您在具有如“IsDependentOn ...”定义的依赖关系的任务中使用“WithCriteria”,则将执行任务,尽管依赖不被满足。 一旦你知道这个,你可以处理它。 –

+1

您可以在https://cakebuild.net/提交您的意见,因为我不是Cake的贡献者。这就是说,如果你的构建步骤足够复杂,你可以(应该?)使用Cake扩展模块来封装每个构建步骤。您可以在方法中调用它两次,并在调用之间更改配置。但是,你会有一个单一的构建脚本,虽然我很确定你更好的步骤,利用任务依赖关系。 请注意,我们不知道您的系统的实际复杂性,这个回答理所当然有3个项目与2个目标平台。 –