在VS2012中,BeforeBuild和其他目标发生了什么变化?

sti*_*ijn 16 msbuild visual-studio-2012

我正在尝试在Visual Studio 2012中的C++项目中使用一些预构建步骤,但它们不会被调用(虽然我很确定Visual Studio 2010中的相同技术是正常的).命令行构建表现完全相同.

这是项目文件的结尾; 该文件是使用Visual Studio生成的,然后我刚刚添加了最后几行:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="BeforeBuild">
  <Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile">
  <Message Text="### BeforeCompile ###" />
</Target>
<Target Name="AfterBuild">
  <Message Text="### AfterBuild ###" />
</Target>
Run Code Online (Sandbox Code Playgroud)

这是输出:

Project "d:\temp\temp.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
  Creating "Debug\temp.unsuccessfulbuild" because "AlwaysCreate" was specified.
AfterBuild:
  AfterBuild
FinalizeBuildStatus:
  Deleting file "Debug\temp.unsuccessfulbuild".
  Touching "Debug\temp.lastbuildstate".
Run Code Online (Sandbox Code Playgroud)

所以只考虑AfterBuild而忽略其他的.看看这个我在Microsoft.BuildSteps.targets中找到了这个PropertyGroup:

<BuildDependsOn>
  _PrepareForBuild;
  $(BuildSteps);
  AfterBuild;
  FinalizeBuildStatus;
</BuildDependsOn>
Run Code Online (Sandbox Code Playgroud)

难道这不也有BeforeBuild和BuildEvent目标吗?或者我的MSBuild安装有什么问题导致它使用此BuildSteps.targets文件而不是其他东西?

正如Alexey指出的那样,使用Before/AfterTarget提供了一个可用的解决方法.您只需要处理要使用的目标,但通过查看BuildSteps文件可以轻松实现.这似乎现在工作正常:

<Target Name="BeforeBuild" BeforeTargets="PrepareForBuild">
  <Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile" BeforeTargets="BuildCompile">
  <Message Text="### BeforeCompile ###" />
</Target>
<Target Name="AfterBuild" AfterTargets="Build">
  <Message Text="### AfterBuild ###" />
</Target>
Run Code Online (Sandbox Code Playgroud)

Ale*_*bak 20

我有与你描述的相同的msbuild目标,所以我认为你的msbuild安装没问题.看起来他们决定对目标和依赖项做一些清理(不确定这个问题是否与VS版本有关,VS只是使用相同的目标,由msbuild提供).在Microsoft.common.targets中仍然存在BeforeBuild和其他目标.我想它只是为.NET项目保留(我从来没有玩过C++,所以我不知道在那里构建管道).

无论如何它在以前的版本上是否有效,你的问题可以更容易解决 - 只需使用新的属性BeforeTargets\AfterTargets for MSBuild 4.0并直接将你的目标挂钩到你想要的任何东西:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="BeforeBuild" BeforeTargets="Build">
     <Message Text="### BeforeBuild ###" Importance="high" />
</Target>
<Target Name="BeforeCompile" BeforeTargets="Compile">
    <Message Text="### BeforeCompile ###" Importance="high" />
</Target>
<Target Name="AfterBuild" AfterTargets="Build">
    <Message Text="### AfterBuild ###" Importance="high" />
</Target>
Run Code Online (Sandbox Code Playgroud)

  • 我自由地添加了"重要性="高"`.这需要确保[消息进入控制台](/sf/ask/736143551/),默认[详细设置](/sf/ask/234655991/).没有它,看起来目标不会被执行,这在与msbuild进行摔跤时非常混乱. (2认同)