FAKE模式将目标构建顺序与依赖项分开

时间:2014-01-24 13:44:21

标签: f#-fake

在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将始终运行。 这似乎完全支持我的场景,实际上非常灵活,但如果有多个可选阶段,可能会有点复杂。

这是预期的方式以及其他人如何做到这一点,还是我错过了一些明显的东西?

3 个答案:

答案 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"]