2

例から始めましょう...私はこれに似たall.projを持っています:

<ItemGroup>
  <ProjectsToBuild Include="..\Sites\*\*.csproj" />
</ItemGroup>

<Target Name="DeployWebsites" DependsOnTargets="BuildMergedSolutions">
  <AspNetCompiler 
    PhysicalPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)"
    TargetPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)..\..\..\deploy\%(ProjectsToBuild.Filename)"
    VirtualPath="/%(ProjectsToBuild.Filename)%(ProjectsToBuild.Extension)"
    Debug="true"
    Updateable="true"
    Force="true" />
</Target>

タスクの1つが失敗すると、ターゲットを終了します。エラーを出力して残りのタスクを実行し続ける方法はありますか?

ContinueOnErrorは、エラーを警告に変換するだけなので、オプションではありません。最終的にビルドを失敗させたいのですが、取得できる限り多くのエラー情報も取得したいので、一部のサイトが失敗したとしても、すべてのサイトをコンパイルする必要があります。

4

1 に答える 1

3

これを行う唯一の方法は、エラーがいつ発生したかを検出できる場合です。基本的に、タスクは何らかのアーティファクトを書き出すか、失敗したかどうかを判断できる出力パラメーターを提示する必要があります。これを使用して、タスク自体の ContinueOnError を true に設定します。アイデアは、ContinueOnError を true に設定し、すべてのタスク呼び出しを完了させてから、エラーがあったかどうかを確認し、それに応じて行動することです。

MSBuild から単体テストを実行するために、同様のことを行いました。すべての単体テストをすべてのテスト アセンブリで実行したかったのですが、完了後にビルドを失敗させたかったのです。そのため、ContinueOnError を true に設定し、結果が書き込まれた XML ファイルで失敗したテスト ケースを検索し、そのファイルからメッセージを集約しました。

あなたの場合、AspNetCompiler タスクはそのようなファイルを書き出しません。AspNetCompiler は、 ToolTask​​ を (ToolTask​​Extension 経由で)拡張することによって aspnet_compiler.exe ユーティリティをラップしているため、ExitCode を追跡できます。そのタスクを拡張する独自のタスクを作成しないと、ちょっと注意が必要です。ターゲット バッチ処理を使用すると、AspNetCompiler タスクを呼び出して、各 ExitCode をファイルに書き込むことができます。その後、そのファイルを調べて、ゼロ以外の終了コードを探します。AspNetCompiler タスクを拡張する独自のカスタム タスクを作成することを検討することをお勧めします。これは非常に簡単に作成できるはずです。

バッチ処理の詳細については、http://sedotech.com/Resources#Batchingのリソースを参照してください。

于 2010-01-22T04:29:29.397 に答える