如何使当目标在VS解决方案失败的MSBuild失败?(How to make msbuild fai

2019-07-18 08:14发布

我使用在命令行上的MSBuild建立包含一个C ++项目VS2012溶液。 该项目有生成后运行一个目标:

<Target Name="RunTargetAfterBuild" AfterTargets="Build">
  <Error Text="I am a failing target" />
</Target>

我想在构建时在建设过程中的MSBuild返回一个错误,但是某个地方,错误已被丢失的MSBuild报告“构建成功”。 因此,该ERRORLEVEL仍设置为0,这是相当难以察觉,一旦发生过程中自动构建错误。 如何让我的MSBuild传播这个错误一直到顶层的项目/解决方案? 我知道这是可能的,因为它是编译器错误和喜欢会发生什么。

以下是输出的相关部分:

> msbuild test.sln

...

...: error : I am a failing target  [...test.vcxproj]
Done Building Project "...test.vcxproj" (default targets) -- FAILED.

Done Building Project "...test.vcxproj.metaproj" (default targets).

Done Building Project "...test.sln" (Build target(s)).

Build succeeded.    --> this is NOT what I want

....

0 Warning(s)
1 Error(s)

虽然编译器错误输出是这样的:

> msbuild test.sln

....

...: error C3861: 'HECK': identifier not found [...test.vcxproj]
Done Building Project "...test.vcxproj" (default targets) -- FAILED.

Done Building Project "...test.vcxproj.metaproj" (default targets) -- FAILED.

Done Building Project "....test.sln" (Build target(s)) -- FAILED.


Build FAILED.     --> this is what I want

0 Warning(s)
1 Error(s)

艾伦回答,什么是作品命名目标AfterBuild ,因为这是一个已知目标的MSBuild。 然而,需要目标被导入Microsoft.Cpp.targets这是有点容易出错之后定义,并就更难定义多个目标的生成后运行。 虽然研究这个我发现,使用AfterTargets不使用时,如预期那样工作, Build目标,但任何其他的目标。 不知道为什么,但它这样做,现在我用这个方法,而不是:

<Target Name="RunTargetAfterBuild" AfterTargets="FinalizeBuildStatus">
  <Error Text="I am a failing target" />
</Target>

Answer 1:

您自定义的目标添加到项目中的InitialTargets属性。

InitialTargets = “RunTargetAfterBuild”

你是正确的,这不会解决你的问题。 但使用AfterBuild目标我能摄制,并得到的MSBuild上的.sln失败



Answer 2:

您可以扩展BuildDependsOn财产,包括你的目标是什么构成了成功的构建部分:

<PropertyGroup>
  <BuildDependsOn>
      $(BuildDependsOn);
      RunTargetAfterBuild
  </BuildDependsOn>
</PropertyGroup>

更多详细信息可以在这里找到: http://msdn.microsoft.com/en-us/library/ms366724.aspx



Answer 3:

我相信出错项目应该只有一个条件得到满足,而不是每次都失败(这大概是你想要什么?)

例如

<Error Text="Setup Kit Failed to copy!" Condition="'@(FilesList)' == ''" /> 

如果条件满足(在这种情况下,以前的副本任务,没有复制的文件),只有这样,错误得到提升,然后失败构建



Answer 4:

更好的实现你的AfterBuild的解决办法是使用BeforeTargets ,就像这样:

<Target Name="RunTargetAfterBuild" BeforeTargets="AfterBuild">
  <Error Text="I am a failing target" />
</Target>

这支持了多个这样的目标,并且不依赖于包容为了与Microsoft.Cpp.targets



文章来源: How to make msbuild fail when a target fails in a VS solution?