我正在尝试获取一些预构建步骤以在 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>