2016-08-24 12 views
1

私がよく知っているビルドシステム(makeとmsbuild)には、ターゲットの入力と出力を指定する方法があります。入力ファイルのタイムスタンプが出力のタイムスタンプより早い場合、タスクはスキップされます。私はFAKEで何か類似したものを見つけることができません。私は、ビルドコマンドを実行すると、それは常にコンパイラを実行します、しかし偽ターゲット入力と出力をどのように指定しますか?

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

:私は偽の

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

にこのMakefileを翻訳したい場合

例えば、それは次のようになりますa.fs.の変更時間に関係なく、新しいa.exeを生成します。 makefileと同じ動作をさせる簡単な方法はありますか?

答えて

2

=?>を使用して、タスクを実行する必要がある場合はtrueまたはfalseを返す関数を提供できます。

let fileModified f1 f2 = 
    FileInfo(f1).LastWriteTime > FileInfo(f2).LastWriteTime 

と、ターゲットの依存関係にある

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

これは本当によく働きます。これを使用して入出力ファイルリストを受け付ける冗長性のないBuildTargetを簡単に定義することもできます。他の誰かが役に立つと思った場合に備えてサンプルを追加します。 – Eric

0

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" 
関連する問題