构建失败后运行MSBuild目标
问题描述:
我的自定义MSBuild任务在实际构建之前和之后执行一些步骤。构建之后的步骤始终执行以清理某些文件是非常重要的。我现在有定义的两个目标:始终执行构建失败后运行MSBuild目标
<Target Name="NrtPatchAssemblyInfo" BeforeTargets="BeforeBuild">
和
<Target Name="NrtRestoreAssemblyInfo" AfterTargets="AfterBuild">
第一个,但第二只成功的建后运行。如果编译器生成失败,例如由于代码文件中的语法错误,则不运行第二个目标。
我能做些什么来改变这种情况,并始终执行第二项任务?
我找不到MSBuild通常使用的目标名称列表。这些名称只是从其他来源复制而来。
答
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>
为了弄清楚得到执行只是运行与详细冗长构建它的目标。
当一个失败时没有更多的目标?那么我该如何做清理工作或任何错误后需要完成的工作呢?复制Visual Studio基础结构不是我的选择(但)。 – ygoe
您也可以删除需要清理工作:更容易修复imo。制作你想要修补程序集信息的任何文件的副本,将其复制到中间目录等等,然后在构建中使用该副本。如果副本的更改没有得到恢复,则无关紧要。 – stijn
我终于回到了这个话题。我已将工具更改为不修补和恢复文件,但将修改后的文件保存为obj \,并使用该文件(包括)而不是原始文件(删除)。 – ygoe