コマンドラインでmsbuildを使用して、C++プロジェクトを含むVS2012ソリューションをビルドしています。プロジェクトには、ビルド後に実行されるターゲットがあります。
<Target Name="RunTargetAfterBuild" AfterTargets="Build">
<Error Text="I am a failing target" />
</Target>
ビルド時にmsbuildがエラーを返すようにしたいのですが、ビルドの途中でエラーが失われ、msbuildが「ビルドに成功しました」と報告します。その結果、ERRORLEVELはまだ0に設定されているため、自動ビルド中に問題が発生したかどうかを検出するのは非常に困難です。msbuildにこのエラーをトップレベルのプロジェクト/ソリューションに伝播させるにはどうすればよいですか?コンパイラエラーなどで起こるので、これが可能であることを私は知っています。
出力の関連部分は次のとおりです。
> msbuild test.sln
...
...: error : I am a failing target [...test.vcxproj]
Done Building Project "...test.vcxproj" (default targets) -- FAILED.
Done Building Project "...test.vcxproj.metaproj" (default targets).
Done Building Project "...test.sln" (Build target(s)).
Build succeeded. --> this is NOT what I want
....
0 Warning(s)
1 Error(s)
コンパイラエラーの場合、出力は次のようになります。
> msbuild test.sln
....
...: error C3861: 'HECK': identifier not found [...test.vcxproj]
Done Building Project "...test.vcxproj" (default targets) -- FAILED.
Done Building Project "...test.vcxproj.metaproj" (default targets) -- FAILED.
Done Building Project "....test.sln" (Build target(s)) -- FAILED.
Build FAILED. --> this is what I want
0 Warning(s)
1 Error(s)
解決
アレンが答えたようにAfterBuild
、それはmsbuildの既知のターゲットであるため、機能するのはターゲットに名前を付けることです。ただし、これには、Microsoft.Cpp.targetsをインポートした後にターゲットを定義する必要があります。これにより、エラーが発生しやすくなり、ビルド後に実行する複数のターゲットを定義することが難しくなります。これを調査していると、ターゲットを使用せずに他のターゲットAfterTargets
を使用した場合でも、使用すると期待どおりに機能することがわかりました。Build
理由はわかりませんが、代わりにこのソリューションを使用しています。
<Target Name="RunTargetAfterBuild" AfterTargets="FinalizeBuildStatus">
<Error Text="I am a failing target" />
</Target>