你如何指定假目标输入和输出?
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"
在我熟悉的构建系统(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 相同的行为?
您可以使用 =?>
并提供一个函数,如果任务应该 运行。
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"