在VS中,Build(incremental)和Rebuild之间通常有区别,后者首先要清理,然后像Build一样。我可以用FAKE提供类似的行为吗?
让我们假设以下目标:
Target "Clean" DoNothing
Target "Work" DoNothing
Target "All" DoNothing
RunTargetOrDefault "All"
通常我想要运行所有这些,在工作前清洁,所以我最终得到:
"Clean" ==> "Work" ==> "All"
然而,Work并不是真的依赖于Clean - 只有当两者都要运行时,Clean必须先运行。使用上面的依赖链,我无法运行Work而不首先运行Clean。是否有方法或共同模式来支持这一点?
到目前为止我一直在考虑:
A)
"Clean" ==> "All"
"Work" ==> "All"
这正确地表示了All的依赖关系,但是在工作之前清理应该是的顺序 - 如果两者都运行 - 则缺失。
B)
Target "WorkOnly" DoNothing
"WorkOnly" ==> "Work"
"Clean" ==> "Work" ==> "All"
这有点接近,但仍然无法保证在WorkOnly之前构建All that Clean将会运行
C)
Target "Start" DoNothing
"Start"
=?> ("Clean", not (hasBuildParam "noclean"))
==> "Work"
==> "All"
这样,除非我指定“noclean”作为参数,否则Clean将始终运行。 这似乎完全支持我的场景,实际上非常灵活,但如果有多个可选阶段,可能会有点复杂。
这是预期的方式以及其他人如何做到这一点,还是我错过了一些明显的东西?
答案 0 :(得分:8)
我参加派对有点晚了......但我最近遇到了这种要求。
我终于解决了以下问题:
在你的情况下会留下你的
Target "Clean" DoNothing
Target "Work" DoNothing
Target "Build" (fun _ ->
Run "Work"
)
Target "Rebuild" (fun _ ->
"Clean"
==> "Work"
Run "Work"
)
答案 1 :(得分:3)
不,目前没有这方面的操作员。您可能希望使用新运算符创建拉取请求。
我们还有一个prototype implementation用于未来的目标依赖运行时。您也可以尝试在那里添加新的运算符。
答案 2 :(得分:0)
我在这里很晚了,但这可能会对某人有所帮助。您可以像这样使用软依赖项(如果愿意,可以用“工作”代替“构建”):
// read 'x ==> y ' as "x runs before y"
"Build" ==> "All"
"Clean" ==> "All"
"Clean" ?=> "Build" // Soft dependency: Correct order when multi-threading?
"All" ==> "Deploy"
或者,我更喜欢<==
运算符。
// read 'x <== ys' as "x depends on ys" like traditional make rules
"Build" <=? "Clean"
"All" <== ["Clean"; "Build"]
"Deploy" <== ["All"]