2014-02-12 24 views
1

我想爲兩個項目調用MSbuild兩次。第一次沒有任何干淨的,但如果這失敗了,我會調用一個乾淨的,然後一個新的構建。 (理由是我希望我的構建速度很快,但是如果這個失敗會回落到清理狀態,請恢復nuget包等等)。這可以工作,但如果第一次調用失敗,它的構建仍然會失敗(它的continueonerror設置爲true,所以我不希望它失敗...)。以下是構建文件的相關部分:Msbuild忽略continueonerror?

 <ItemGroup> 
     <ProjectsToPublish Include="X.sln" /> 

     </ItemGroup> 

     <Target Name="RestoreAllPackages"> 
     <Message Text="@(ProjectsToPublish)" /> 
     <Exec Command='"$(MSBuildProjectDirectory)\.nuget\nuget.exe" restore "$(MSBuildProjectDirectory)\%(ProjectsToPublish.Identity)"' 
      /> 
     </Target> 

     <Target Name="Build" > 

     <MSBuild Projects="@(ProjectsToPublish)" Properties="SkipRestore=True;RunCodeAnalysis=False;Retries=10;RetryDelayMilliseconds=50" 
       BuildInParallel="true" ContinueOnError="WarnAndContinue" /> 

     <!-- MSBuildLastTaskResult outcome of previous task--> 
     <PropertyGroup> 
      <FastBuildFailed>false</FastBuildFailed> 
      <FastBuildFailed Condition="'$(MSBuildLastTaskResult)' == 'false'" >true</FastBuildFailed> 
     </PropertyGroup> 

     <Message Importance="high" Text="Initial build failed? $(FastBuildFailed)" /> 

     <Message Importance="high" Text="Initial build failed will retry" Condition="'$(FastBuildFailed)'" /> 

     <CallTarget Targets="FullBuild" Condition="'$(FastBuildFailed)'" /> 


     </Target> 


     <Target Name="FullBuild" DependsOnTargets="RestoreAllPackages"> 

     <!--Fake property below to reexecute build exact same properties prevents the build lform re--> 
     <MSBuild Projects="@(ProjectsToPublish)" Properties="SkipRestore=True;RunCodeAnalysis=False;FakeProperty=one" BuildInParallel="true" /> 

     </Target> 


     <Target Name="RestoreAllPackages"> 
     <Message Text="@(ProjectsToPublish)" /> 
     <Exec Command='"$(MSBuildProjectDirectory)\.nuget\nuget.exe" restore "$(MSBuildProjectDirectory)\%(ProjectsToPublish.Identity)"' 
      /> 
     </Target> 
+0

嗯現在看來,這可能只是日誌輸出使它看起來像失敗 – Konstantin

回答

1

對於任何有此相當異常錯誤的人。看起來,當構建在TFS構建服務器內運行時,構建服務器會解析日誌輸出,即使使用ContinueOnError設置也會失敗構建。我的解決辦法最終被<Exec Command="$(MSBuildBinPath)\msbuild.exe @(ProjectsToPublish) /noconlog " ContinueOnError="true" /> 使用Exec的基本上生成一個新的MSBuild,並確保它沒有使用/noconlog

+0

只需在您的觀察中添加「構建服務器解析日誌輸出」的詳細信息即可。特別是,TFS中的MSBuild活動構建過程「如果記錄任何編譯錯誤,則將CompilationStatus設置爲Failed」(https://msdn.microsoft.com/zh-cn/library/gg265783(v=vs.110).aspx# Activity_MSBuild)。可以修改構建過程模板,並使用SetBuildProperties活動更改MSBuild活動運行後的構建狀態。 (但我的答案中的全部MSBuild方法更直接。) – weir

0

不輸出任何東西,而不是使用<OnError...,您可以指定ContinueOnError'WarnAndContinue',然後使用一個條件來檢查$(MSBuildLastTaskResult)屬性。

通用示例:

<Error ContinueOnError="WarnAndContinue" /> 
<Message Importance="High" Text ="$(MSBuildLastTaskResult)" /> 
<!-- (Returns false) --> 

(我相信無論"WarnAndContinue"$(MSBuildLastTaskResult)中的MSBuild 4.0中引入;他們應可你的TFS 2012生成服務器上)