我想運行一個MSBuild任務(它簽署一個可執行文件/ DLL),但只有當輸出exe/DLL已經改變。如果沒有任何源文件更改導致重新編譯exe/dll,那麼我不希望任務運行。只有當您的項目輸出已經建好時,您如何纔能有條件地運行MSBuild任務?
儘管花了幾個小時嘗試不同的東西,我不能解決如何讓我的目標任務只在項目已經被編譯輸出文件已經改變的地方運行(換句話說,我認爲CoreCompile目標沒有被跳過) 。
我想運行一個MSBuild任務(它簽署一個可執行文件/ DLL),但只有當輸出exe/DLL已經改變。如果沒有任何源文件更改導致重新編譯exe/dll,那麼我不希望任務運行。只有當您的項目輸出已經建好時,您如何纔能有條件地運行MSBuild任務?
儘管花了幾個小時嘗試不同的東西,我不能解決如何讓我的目標任務只在項目已經被編譯輸出文件已經改變的地方運行(換句話說,我認爲CoreCompile目標沒有被跳過) 。
應該是相同的this answer,使用TargetOutputs parameter ::
<MSBuild Projects="File.sln" >
<Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug -->
<CallTarget Targets="SignExe" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />
你可以只是這樣做:
<PropertyGroup>
<TargetsTriggeredByCompilation>DoStuffWithNewlyCompiledAssembly</TargetsTriggeredByCompilation>
</PropertyGroup>
這工作,因爲有人在微軟智能添加以下行末的CoreCompile
目標在Microsoft.[CSharp|VisualBasic][.Core].targets
(文件名取決於語言和MSBuild/Visual Studio版本)。
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>
所以,如果你在TargetsTriggeredByCompilation
屬性指定目標的名字,你的目標運行,如果CoreCompile
runs--如果CoreCompile
被跳過你的目標將無法運行(例如,因爲輸出組件已經啓動,TO-關於代碼的日期)。
我認爲這是一種不同的方法 - 我試圖瞭解如何在項目文件的上下文中執行此操作.csproj用於常規項目 - 不創建以解決方案爲目標的MSBuild項目文件 – 2010-11-12 14:56:14