2017-08-31 109 views
1

我的自定義MSBuild任務在實際構建之前和之後執行一些步驟。構建之後的步驟始終執行以清理某些文件是非常重要的。我現在有定義的兩個目標:始終執行構建失敗後運行MSBuild目標

<Target Name="NrtPatchAssemblyInfo" BeforeTargets="BeforeBuild"> 

<Target Name="NrtRestoreAssemblyInfo" AfterTargets="AfterBuild"> 

第一個,但第二隻成功的建後運行。如果編譯器生成失敗,例如由於代碼文件中的語法錯誤,則不運行第二個目標。

我能做些什麼來改變這種情況,並始終執行第二項任務?

我找不到MSBuild通常使用的目標名稱列表。這些名稱只是從其他來源複製而來。

回答

0

MsBuild在發生錯誤時會停止運行任何其他目標(除非ContinueOnError在某處被修改,但無法編輯所有安裝的msbuild文件以獲得該工作)。一種解決方案是使用OnError元素。這必須在失敗的目標(或者該目標的父目錄)上設置,因此您必須選擇在實際構建中使用的目標並覆蓋它。對於C++構建,您將覆蓋構建目標,從Microsoft.Common.CurrentVersion.targets複製定義並添加OnError。示例代碼(必須插在Microsoft.Cpp.targets導入後的項目文件!):

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
<Target Name="RunOnError"> 
    <Message Text="OOPS!" /> 
</Target> 
<Target 
    Name="Build" 
    Condition="'$(_InvalidConfigurationWarning)' != 'true'" 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)"> 
    <OnError ExecuteTargets="RunTargetAfterBuild" /> 
</Target> 

爲了弄清楚得到執行只是運行與詳細冗長構建它的目標。

+0

當一個失敗時沒有更多的目標?那麼我該如何做清理工作或任何錯誤後需要完成的工作呢?複製Visual Studio基礎結構不是我的選擇(但)。 – ygoe

+1

您也可以刪除需要清理工作:更容易修復imo。製作你想要修補程序集信息的任何文件的副本,將其複製到中間目錄等等,然後在構建中使用該副本。如果副本的更改沒有得到恢復,則無關緊要。 – stijn

+0

我終於回到了這個話題。我已將工具更改爲不修補和恢復文件,但將修改後的文件保存爲obj \,並使用該文件(包括)而不是原始文件(刪除)。 – ygoe

相關問題