msbuild - VS2012 中的 BeforeBuild 和其他目标发生了什么?

标签 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>

这是输出:

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".

所以只考虑AfterBuild,其他的都被忽略。 对此我在 Microsoft.BuildSteps.targets 中发现了这个 PropertyGroup:

<BuildDependsOn>
  _PrepareForBuild;
  $(BuildSteps);
  AfterBuild;
  FinalizeBuildStatus;
</BuildDependsOn>

这不应该也有 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>

最佳答案

我的 msbuild 目标与您所描述的相同,所以我认为您的 msbuild 安装没问题。

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

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

<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>

关于msbuild - VS2012 中的 BeforeBuild 和其他目标发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727351/

相关文章:

msbuild - 类型或命名空间名称 'WebApi' 在命名空间 'Microsoft.AspNet' 中不存在(是否缺少程序集引用?)

build - 确认 <UsingTask> 声明是正确的

asp.net-mvc-4 - 具有自定义角色的 MVC 4 Intranet 身份验证

c# - Windows 10 + 请求被中止 : Could not create SSL/TLS secure channel

c# - 如何在 Visual Studio 2015 及更高版本中打开空白应用程序 (XAML)? - C#

c# - Roslyn:如何在 Visual Studio 之外加载现有项目

msbuild - TeamCity:管理验收测试的部署依赖关系?

c# - 有没有一种简单的方法可以使 Visual Studio 2015 使用特定的 ToolsVersion?

windows - 调试 Windows 组件对象模型 (COM) 中的内存泄漏

visual-studio-2010 - CS1684 对 System.Windows.Input.ICommand 类型的引用声称它在 'xxx' 中定义,但找不到