我试图两次为几个项目调用MSbuild。第一次没有任何干净,但如果失败,我将调用一个干净,然后是一个新的构建。(理由是,我希望我的构建是快速的,但如果不能恢复干净,恢复nuget包构建等等)。这是可行的,但是如果第一次调用失败,构建仍然会失败(它已经设置为true,所以我不希望它失败.)。以下是构建文件的相关部分:
<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>发布于 2014-02-18 09:44:23
对于任何有这种奇怪错误的人来说。当构建在TFS构建服务器内部运行时,构建服务器解析日志输出,即使使用ContinueOnError设置也会失败。我的解决办法是<Exec Command="$(MSBuildBinPath)\msbuild.exe @(ProjectsToPublish) /noconlog " ContinueOnError="true" />,基本上是使用Exec生成一个新的MSBuild,并确保它没有使用/noconlog输出任何内容。
发布于 2015-11-18 16:50:49
与使用<OnError...不同,您可以为ContinueOnError分配值'WarnAndContinue',然后使用一个条件检查$(MSBuildLastTaskResult)属性。
一般例子:
<Error ContinueOnError="WarnAndContinue" />
<Message Importance="High" Text ="$(MSBuildLastTaskResult)" />
<!-- (Returns false) -->(我相信"WarnAndContinue"和$(MSBuildLastTaskResult)都是在MSBuild 4.0中引入的;它们应该可以在您的TFS 2012构建服务器上使用。)
https://stackoverflow.com/questions/21726462
复制相似问题