我開發了自定義目標,如果編譯(csc)已完成(否則構建過程需要過長),則需要僅運行。 我發現Inputs
和Outputs
屬性可用於比較文件時間戳,並在Inputs
集合中存在較新文件時執行目標。問題是我的目標不生成任何文件,所以我不知道我應該通過什麼作爲Outputs
屬性來獲得此工作正確性(我無法使用目標程序集來檢查它,因爲執行編譯時的時間戳程序集是實際的時間,因此我的目標不會執行)。僅在編譯時運行自定義目標
任何想法我怎麼能做到這一點?
我開發了自定義目標,如果編譯(csc)已完成(否則構建過程需要過長),則需要僅運行。 我發現Inputs
和Outputs
屬性可用於比較文件時間戳,並在Inputs
集合中存在較新文件時執行目標。問題是我的目標不生成任何文件,所以我不知道我應該通過什麼作爲Outputs
屬性來獲得此工作正確性(我無法使用目標程序集來檢查它,因爲執行編譯時的時間戳程序集是實際的時間,因此我的目標不會執行)。僅在編譯時運行自定義目標
任何想法我怎麼能做到這一點?
一個可能的解決方案是使用PostBuildEvent
。 爲了得到這個工作,我們需要做以下幾點:
<PostBuildEvent>
。這可以直接在<PropertyGroup>
內完成,例如:<PostBuildEvent>echo Post build event completed</PostBuildEvent>
。我只使用echo
向輸出寫入消息,因爲<PostBuildEvent>
不能爲空。<PostBuildEvent>
至OnOutputUpdated
。這會導致MSBuild從編譯前後比較彙編時間戳,並且僅在程序集發生更改時才執行<PostBuildEvent>
。<PostBuildEventDependsOn>
完整的例子看起來是這樣執行的目標:
<PropertyGroup>
<PostBuildEvent>echo Post build event completed</PostBuildEvent>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
<PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
</PropertyGroup>
您可以編寫出一個虛擬文件,並利用它來進行輸出。使用目標中的WriteLinesToFile任務輸出一個名爲「MyTarget.output」的文件。
MsBuild將使用該文件的時間戳來跟蹤目標上次運行的時間,然後可以確定輸入文件是否比輸出文件新,並知道是否再次運行目標。
是的,這絕對是一種可能的方式,如何實現這一點。我試圖避免創建虛擬輸出文件,並找到一個更好的方法來做到這一點。但是,謝謝你的回答;) – 2012-04-05 08:47:19