2012-04-04 64 views
2

我開發了自定義目標,如果編譯(csc)已完成(否則構建過程需要過長),則需要僅運行。 我發現InputsOutputs屬性可用於比較文件時間戳,並在Inputs集合中存在較新文件時執行目標。問題是我的目標不生成任何文件,所以我不知道我應該通過什麼作爲Outputs屬性來獲得此工作正確性(我無法使用目標程序集來檢查它,因爲執行編譯時的時間戳程序集是實際的時間,因此我的目標不會執行)。僅在編譯時運行自定義目標

任何想法我怎麼能做到這一點?

回答

0

一個可能的解決方案是使用PostBuildEvent。 爲了得到這個工作,我們需要做以下幾點:

  1. 設定值的<PostBuildEvent>。這可以直接在<PropertyGroup>內完成,例如:<PostBuildEvent>echo Post build event completed</PostBuildEvent>。我只使用echo向輸出寫入消息,因爲<PostBuildEvent>不能爲空。
  2. 設置屬性<PostBuildEvent>OnOutputUpdated。這會導致MSBuild從編譯前後比較彙編時間戳,並且僅在程序集發生更改時才執行<PostBuildEvent>
  3. 設置你的依賴/要在<PostBuildEventDependsOn>

完整的例子看起來是這樣執行的目標:

<PropertyGroup> 
    <PostBuildEvent>echo Post build event completed</PostBuildEvent> 
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
    <PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn> 
</PropertyGroup> 
1

您可以編寫出一個虛擬文件,並利用它來進行輸出。使用目標中的WriteLinesToFile任務輸出一個名爲「MyTarget.output」的文件。

MsBuild將使用該文件的時間戳來跟蹤目標上次運行的時間,然後可以確定輸入文件是否比輸出文件新,並知道是否再次運行目標。

+0

是的,這絕對是一種可能的方式,如何實現這一點。我試圖避免創建虛擬輸出文件,並找到一個更好的方法來做到這一點。但是,謝謝你的回答;) – 2012-04-05 08:47:19

相關問題