构建失败后运行MSBuild目标

时间:2017-08-31 10:07:23

标签: msbuild

我的自定义MSBuild任务在实际构建之前和之后执行一些步骤。必须始终执行构建后的步骤以清理某些文件。我目前定义了两个目标:

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

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

第一个始终执行,但第二个仅在成功构建后运行。如果编译器构建失败,例如由于代码文件中的语法错误,则不会运行第二个目标。

我可以做些什么来改变这个并且总是执行第二个任务?

我找不到MSBuild通常使用的目标名称列表。这些名称只是从其他来源复制而来。

1 个答案:

答案 0 :(得分:2)

当发生错误时,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>

要确定执行哪些目标,只需运行详细详细的构建。