你如何指定假目标输入和输出?

How do you specify Fake Target inputs and output?

在我熟悉的构建系统(make 和 msbuild)中,有一种方法可以指定目标的输入和输出。如果输入文件上的时间戳早于输出上的时间戳,则跳过该任务。我在 FAKE 中找不到类似的东西。

例如,如果我想将此 Makefile 转换为 Fake

a.exe: a.fs
   fsharpc a.fs -o a.exe

它可能看起来像:

Target "a.exe" (fun _ -> ["a.fs"] |> FscHelper.compile [...])

但是,当我 运行 构建命令时,它将 总是 执行编译器并生成一个新的 a.exe 而不管 [=23] 上的修改时间=].有没有简单的方法来获得与 makefile 相同的行为?

您可以使用 =?> 并提供一个函数,如果任务应该 运行。

returns true 或 false
let fileModified f1 f2 =
     FileInfo(f1).LastWriteTime > FileInfo(f2).LastWriteTime

然后在目标依赖项中

     =?> ("a.exe", fileModified "a.fs" "a.exe")

充实 Lazydevs 答案的更完整的代码示例:

#r "packages/FAKE/tools/FakeLib.dll"
open Fake
open System.IO

Target "build" (fun _ ->
  trace "built"
)

let needsUpdate f1 f2 =
  let lastWrite files =
    files
    |> Seq.map (fun f -> FileInfo(f).LastWriteTime)
    |> Seq.max
  let t1 = lastWrite f1
  let t2 = lastWrite f2
  t1 > t2

let BuildTarget name infiles outfiles fn =
  Target name (fn infiles)
  name =?> ("build", needsUpdate infiles outfiles)

BuildTarget "compile" ["Test2.fs"; "Test1.fs"] ["Test2.dll"] (fun files _ ->
  files
  |> FscHelper.compile [
    FscHelper.Target FscHelper.TargetType.Library
  ]
  |> function 0 -> () | c -> failwithf "compile error"
)

RunTargetOrDefault "build"