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



我正试图让一些预构建步骤在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:temptemp.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
Creating "Debugtemp.unsuccessfulbuild" because "AlwaysCreate" was specified.
AfterBuild:
AfterBuild
FinalizeBuildStatus:
Deleting file "Debugtemp.unsuccessfulbuild".
Touching "Debugtemp.lastbuildstate".

因此,只考虑AfterBuild,而忽略其他部分。对此,我在Microsoft中找到了此PropertyGroup。BuildSteps.targets:

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

这不是也应该有BeforeBuild和BuildEvent目标吗?或者我的MSBuild安装有问题,导致它使用此BuildSteps.target文件而不是其他文件?

解决方案

正如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,并将你的目标直接挂在你想要的任何东西上:

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

相关内容

最新更新