2017-08-31 22 views
1

私のカスタムMSBuildタスクは、実際のビルドの前後にいくつかのステップを実行します。ビルド後の手順は、常にいくつかのファイルをクリーンアップするために実行することが不可欠です。最初のものは常に実行されるが、2番目は唯一成功したビルド後に実行失敗したビルド後にMSBuildターゲットを実行する

<Target Name="NrtPatchAssemblyInfo" BeforeTargets="BeforeBuild"> 

<Target Name="NrtRestoreAssemblyInfo" AfterTargets="AfterBuild"> 

:私は現在、定義された2つの目標を持っています。たとえば、コードファイルの構文エラーのためにビルドがコンパイラによって失敗した場合、2番目のターゲットは実行されません。

これを変更して、常に2番目のタスクを実行するにはどうすればよいですか?

MSBuildが通常使用するターゲット名のリストが見つかりませんでした。これらの名前は他のソースからコピーされたものです。

答えて

0

エラーが発生した場合、MsBuildはさらなるターゲットの実行を停止します(ただし、ContinueOnErrorはどこかで変更されますが、インストールされているすべてのmsbuildファイルを編集することはできません)。 1つの解決策は、OnError要素を使用することです。これは、失敗したターゲット(またはそのターゲットの親)に設定する必要があります。そのため、実際のビルドで使用されているものを選択してオーバーライドする必要があります。 C++ビルドでは、ビルドターゲットをオーバーライドし、Microsoft.Common.CurrentVersion.targetsの定義をコピーしてOnErrorを追加します。サンプルコードは、(Microsoft.Cpp.targetsインポート後にプロジェクトファイルに挿入する必要があります!):

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
<Target Name="RunOnError"> 
    <Message Text="OOPS!" /> 
</Target> 
<Target 
    Name="Build" 
    Condition="'$(_InvalidConfigurationWarning)' != 'true'" 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)"> 
    <OnError ExecuteTargets="RunTargetAfterBuild" /> 
</Target> 

だけ詳細な冗長でビルドを実行実行しますその目標を把握します。

+0

1つでも障害が発生した場合、これ以上のターゲットはありませんか?どのように私はその後、クリーンアップ作業やエラーの後に行う必要がある何かを行うことができますか? Visual Studioインフラストラクチャのコピーは私にとってはまだ選択肢ではありません。 – ygoe

+1

また、クリーンアップ作業の必要性を取り除くこともできます。アセンブリ情報のパッチを適用するファイルのコピーを作成し、それを中間ディレクトリなどにコピーし、そのコピーをビルドで使用します。コピーへの変更が元に戻らないかどうかは関係ありません。 – stijn

+0

私はついにこのトピックに戻りました。パッチを適用せずにファイルを復元するようにツールを変更しましたが、変更したファイルをobj \に保存し、元のファイル(削除)の代わりにその(インクルード)を使用します。 – ygoe

関連する問題