16

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

1 に答える 1

20

あなたが説明したのと同じ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>
于 2012-12-09T05:55:36.693 に答える