我在命令行上使用 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)
Solution
正如艾伦回答的那样,有效的方法是命名目标AfterBuild
因为这是 msbuild 的已知目标。然而,这需要在导入 Microsoft.Cpp.targets 之后定义目标,这在某种程度上容易出错,并且使得在构建后定义多个运行目标变得更加困难。在研究这个时我发现使用AfterTargets
不使用时确实按预期工作Build
目标但任何其他目标。不知道为什么,但现在我正在使用这个解决方案:
<Target Name="RunTargetAfterBuild" AfterTargets="FinalizeBuildStatus">
<Error Text="I am a failing target" />
</Target>
将自定义目标添加到项目的 InitialTargets 属性中。
InitialTargets =“RunTargetAfterBuild”
您是对的,这不会解决您的问题。但是使用 AfterBuild Target 我能够重现并让 .sln 上的 msbuild 失败
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)