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

Visual studio 当VS解决方案中的目标失败时,如何使msbuild失败?,visual-studio,msbuild,projects-and-solutions,Visual Studio,Msbuild,Projects And Solutions,我在命令行上使用MSBug来构建包含C++项目的VS2012解决方案。项目有一个在生成后运行的目标: <Target Name="RunTargetAfterBuild" AfterTargets="Build"> <Error Text="I am a failing target" /> </Target> 对于编译器错误,输出如下: > msbuild test.sln .... ...: error C3861: 'HECK': ide

我在命令行上使用MSBug来构建包含C++项目的VS2012解决方案。项目有一个在生成后运行的目标:

<Target Name="RunTargetAfterBuild" AfterTargets="Build">
  <Error Text="I am a failing target" />
</Target>
对于编译器错误,输出如下:

> 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)
解决方案

正如Allen所回答的,工作的是命名目标
AfterBuild
,因为这是msbuild的已知目标。但是,这需要在导入Microsoft.Cpp.targets后定义目标,这在某种程度上容易出错,并且使定义多个目标以在生成后运行变得更加困难。在研究这一点时,我发现,当不使用
构建
目标而使用任何其他目标时,使用
后目标
确实可以像预期的那样工作。不知道为什么,但现在我使用这个解决方案:

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

我认为只有满足条件时错误项才会失败,而不是每次都失败(这大概是您想要的?)

比如说

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


如果满足条件(在本例中,以前的复制任务未复制任何文件),则只会引发错误,这将导致生成失败。将自定义目标添加到项目的InitialTargets属性中

InitialTargets=“RunTargetAfterBuild”

你是对的,这不会解决你的问题。但是使用后构建目标,我能够重新编程并使.sln上的msbuild失败


您可以扩展BuildDependsOn属性,将您的目标作为成功构建的一部分:

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

$(BuildDependsOn);
RunTargetAfterBuild
更多详细信息可在此处找到:

您的
后构建解决方案的更好实现是在目标之前使用
,如下所示:

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


这支持多个这样的目标,并且不依赖于包含顺序与Microsoft.Cpp.targets的对比

如果没有使用任何条件,错误任务总是导致失败:正如我发布的输出中所示:它明确给出了错误,并将项目的构建设置为失败,但不知何故,这不会传播到父项目/解决方案我的错误。您是否直接尝试过后建目标?我能够使用这个在VS2012中不起作用的方法重新编程并解决问题,请参见此处:您指示我的帖子也显示了正在根据显示的输出启动后构建。我使用的是VS2012,更新版本1,后版本工作正常。oops忘记了是前版本等出现了问题-使用后版本似乎还可以,但是这可能会覆盖其他可能的目标,并且定义多个目标变得更加困难,因此我宁愿使用Before/After机制如果您想在整个构建过程之后做一些事情,那么您应该覆盖BuildDependsOn以在现有构建之后处理您的目标。但是,请参见建议的方法是使用AfterBuild,除非您需要更多的控制。您对覆盖目标的关注仍然适用于任何方法,并且完全取决于您如何编写自定义目标。+1这确实有效,但与仅在导入Microsoft.Cpp.targets后定义PropertyGroup时的烦恼相同
<Target Name="RunTargetAfterBuild" BeforeTargets="AfterBuild">
  <Error Text="I am a failing target" />
</Target>