当目标在VS解决方案中失败时,如何使msbuild失败?

sti*_*ijn 6 msbuild projects-and-solutions visual-studio

我在命令行上使用msbuild来构建包含C++项目的VS2012解决方案.该项目有一个在构建之后运行的目标:

<Target Name="RunTargetAfterBuild" AfterTargets="Build">
  <Error Text="I am a failing target" />
</Target>
Run Code Online (Sandbox Code Playgroud)

我希望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)
Run Code Online (Sandbox Code Playgroud)

对于编译器错误,输出是这样的:

> 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)
Run Code Online (Sandbox Code Playgroud)

正如艾伦回答的那样,有什么工作是命名目标,AfterBuild因为这是msbuild的已知目标.但是,这需要在导入Microsoft.Cpp.targets之后定义目标,这有点容易出错,并且使得在构建之后定义要运行的多个目标变得更加困难.在研究这个时,我发现AfterTargets当不使用Build目标而是使用任何其他目标时,使用确实可以正常工作.不知道为什么,但它确实如此,我现在使用这个解决方案:

<Target Name="RunTargetAfterBuild" AfterTargets="FinalizeBuildStatus">
  <Error Text="I am a failing target" />
</Target>
Run Code Online (Sandbox Code Playgroud)

all*_*len 2

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

InitialTargets =“RunTargetAfterBuild”

您是对的,这不会解决您的问题。但是使用 AfterBuild Target 我能够重现并让 .sln 上的 msbuild 失败