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

Chr*_*egg 9 f#-fake f#-fake-4

在VS中,Build(incremental)和Rebuild之间通常有区别,后者首先要清理,然后像Build一样.我能用FAKE提供类似的行为吗?

我们假设以下目标:

Target "Clean" DoNothing
Target "Work" DoNothing
Target "All" DoNothing

RunTargetOrDefault "All"
Run Code Online (Sandbox Code Playgroud)

通常我想运行所有这些,在工作前清洁,所以我最终得到:

"Clean" ==> "Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)

但是,Work并不是真正依赖Clean - 只有两者都要运行时才能运行Clean.使用上面的依赖链,我无法运行Work而不首先运行Clean.是否有方法或共同模式来支持这一点?

到目前为止我考虑过的事情:

一个)

"Clean" ==> "All"
"Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)

这正确地表示了All的依赖关系,但是在工作之前清理应该是的顺序 - 如果两者都运行 - 都缺失了.

B)

Target "WorkOnly" DoNothing
"WorkOnly" ==> "Work"
"Clean" ==> "Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)

这有点接近,但它仍然无法保证在WorkOnly之前构建All that Clean将运行

C)

Target "Start" DoNothing
"Start"
  =?> ("Clean", not (hasBuildParam "noclean"))
  ==> "Work"
  ==> "All"
Run Code Online (Sandbox Code Playgroud)

这样,除非我指定"noclean"作为参数,否则Clean将始终运行.这似乎完全支持我的场景,实际上非常灵活,但如果有多个可选阶段,可能会有点复杂.

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

pms*_*969 8

我参加派对有点晚了......但我最近遇到了这种要求.

我终于解决了以下问题:

  • 所有任务都是独立的
  • 创建定义不同依赖关系的多个最终状态目标.

在你的情况下会留下你

Target "Clean" DoNothing
Target "Work" DoNothing
Target "Build" (fun _ ->
    Run "Work"
)
Target "Rebuild" (fun _ ->
    "Clean"
        ==> "Work"

    Run "Work"
)
Run Code Online (Sandbox Code Playgroud)


for*_*i23 3

不,目前没有运营商可以执行此操作。您可能想使用新操作员创建拉取请求。

我们还有一个未来目标依赖运行时的原型实现。您还可以尝试在那里添加新的运算符。