2017-08-31 120 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

相关问题