2012-12-20 71 views
5

我有一個MSBuild文件,它可以構建* / .sln文件(構建存在的所有.sln文件)。只有在實際構建項目時才運行MSBuild目標

構建使用構建目標,因此如果沒有對輸入文件進行更改,則不應再構建項目。

我想執行一些自定義目標只有當項目實際上被重新構建。

這怎麼辦?

兩個AfterBuildAfterCompile總是調用,如果編譯/構建實際發生不管。

+0

是每個項目文件中的目標文件,還是屬於解決方案的seperat projet文件? – stijn

+0

單獨的項目文件 –

+0

似乎有點難度..另外,你是否希望在構建任何其他項目時構建目標,或者何時構建所有項目,或者......?每一個後面有 – stijn

回答

5

基本上你想要的相同的行爲PostBuildEvent例如,所以我擡頭Microsoft.Common.Targets是怎麼做的(這個文件總是中的MSBuild應該是怎樣提供了一個很好的洞察力,可以使用)。這裏的解決方案:

<PropertyGroup> 
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
</PropertyGroup> 
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"  
     Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'"> 
    <Message Importance="high" Text="RunWhenBuild!!"/> 
</Target> 

這就是發生的事情:當有一個名爲RunPostBuildEvent財產與OnOutputUpdated的值CoreBuild目標的dependncies最終會前和生成後記錄其輸出文件的時間戳。如果它們相等,則產量不會增加。所以剩下的就是讓你的目標在CoreBuild之後運行並檢查這些時間戳。

+0

似乎是正確的。我會檢查這個!謝謝 –

+0

這裏元素是強制性的嗎? –

+0

是的,它是每個csproj文件末尾附近的標準(需要C#)導入。沒有它,你不能(輕鬆地)構建C#應用程序 – stijn

相關問題