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>