6

コマンドラインで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>
4

4 に答える 4

2

プロジェクトのInitialTargets属性にカスタムターゲットを追加します。

InitialTargets = "RunTargetAfterBuild"

あなたはこれがあなたの問題を解決しないということは正しいです。しかし、AfterBuild Targetを使用すると、.slnでmsbuildを再現して失敗させることができました。

于 2013-01-25T04:04:45.840 に答える
2

BuildDependsOnプロパティを拡張して、成功したビルドを構成するものの一部としてターゲットを含めることができます。

<PropertyGroup>
  <BuildDependsOn>
      $(BuildDependsOn);
      RunTargetAfterBuild
  </BuildDependsOn>
</PropertyGroup>

詳細については、http: //msdn.microsoft.com/en-us/library/ms366724.aspxを参照してください。

于 2014-11-06T15:04:11.417 に答える
0

エラー項目は、条件が満たされた場合にのみ失敗するはずであり、毎回失敗するわけではないと思います(おそらくあなたが望むものですか?)

例えば

<Error Text="Setup Kit Failed to copy!" Condition="'@(FilesList)' == ''" /> 

条件が満たされた場合(この場合、前のコピータスクはファイルをコピーしませんでした)、エラーが発生し、ビルドが失敗します

于 2013-01-17T14:26:12.617 に答える
0

AfterBuildソリューションのより良い実装は、次のBeforeTargetsように使用することです。

<Target Name="RunTargetAfterBuild" BeforeTargets="AfterBuild">
  <Error Text="I am a failing target" />
</Target>

これは、そのような複数のターゲットをサポートし、包含順序とに依存しませんMicrosoft.Cpp.targets

于 2017-09-03T07:27:10.927 に答える