2012-05-29 13 views
12

を使用した場合のMSBuild-タスクが失敗した場合はどうかを確認する方法私はのContinueOnError =真のMSBuildタスク実行しています:のContinueOnError =真

<MSBuild Projects="@(ComponentToDeploy)" 
    Targets="$(DeploymentTargets)" 
    Properties="$(CommonProperties);%(AdditionalProperties)" 
    ContinueOnError="true" 
    Condition="%(Condition)"/> 

だから私のビルドは常に成功を。

エラーが発生したかどうかを確認する手段はありますか?

私はこの情報を含むのMSBuildタスクのいずれか出力を見つけることができませんでした。 私が知っている唯一の方法は、エラーのログファイルを解析することですが、それは私の回避策のようです。

(私はMSBuildの4.0を使用しています)


これは@Ilyaの最後のフィードバックへの答えです。
コメントの長さと書式設定の制限があるため、私はfeedback/answerを使用しています。

ログインがこれは確かに最初の質問だった個々のターゲットにスコープされた以上の特定のタスクであることを...

私はLog.HasLoggedErrorsを使用するために提案してあなたのコメントを読んでいた時に起こった: "ログの範囲は? "です。
残念ながら、私は適切な文書を見つけることができませんでした。 MSNDはあまり役に立ちません...
なぜそれがタスクにスコープされていることを知っていましたか?
私はあなたの声明について全く疑いがない!適切な文書がどこかに存在している場合、私はちょうど(私はあなたがプロジェクトとして何を構築している、年;-)いずれの場合においても

ためのMSBuildを使用していない... を思ったんだけど?

私のテストプロジェクトは非常に簡単です。
MyTest.project

<?xml version="1.0" encoding="utf-8" ?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="ElenasTarget" ToolsVersion="4.0"> 

    <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\MyCompany.Tools.MSBuild.Tasks.dll" TaskName="MSBuildWithHasLoggedErrors" /> 

    <ItemGroup> 
     <MyProjects Include="CopyNotExistingFile.proj" /> 
    </ItemGroup> 

    <Target Name="ElenasTarget"> 
     <MSBuildWithHasLoggedErrors Projects="@(MyProjects)" ContinueOnError="true" > 
      <Output TaskParameter="HasLoggedErrors" PropertyName="BuildFailed" /> 
     </MSBuildWithHasLoggedErrors> 

     <Message Text="BuildFailed=$(BuildFailed)" /> 
    </Target> 
</Project> 
CopyNotExistingFile.projはただ存在しないファイルをコピーしようとします:

<?xml version="1.0" encoding="utf-8" ?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Target1" ToolsVersion="4.0"> 
    <Target Name="Target1"> 
     <Copy SourceFiles="C:\lalala.bum" DestinationFiles="C:\tralala.bam" /> 
    </Target> 
</Project> 

をそして、これは私のカスタムタスクMSBuildWithHasLoggedErrors

です
namespace MyCompany.Tools.MSBuild.Tasks 
{ 
    public class MSBuildWithHasLoggedErrors : Microsoft.Build.Tasks.MSBuild 
    { 
     [Output] 
     public bool HasLoggedErrors { get; private set; } 

     public override bool Execute() 
     { 
      try 
      { 
       base.Execute(); 
       HasLoggedErrors = Log.HasLoggedErrors; 
      } 
      catch (Exception e) 
      { 
       Log.LogErrorFromException(e, true); 
       return false; 
      } 

      return true; 
     } 
    } 
} 
MSB3021)がログに記録されましたが、私がMyTest.projを作成した場合、 HasLoggedErrorsfalseに設定されます。)コンソールロガーに:

Project "C:\Users\elena\mytest.proj" on node 1 (default targets). 
Project "C:\Users\elena\mytest.proj" (1) is building "C:\Users\elena\CopyNotExistingFile.proj" (2) on node 1 (default targets). 
Target1: 
    Copying file from "C:\lalala.bum" to "C:\tralala.bam". 
C:\Users\elena\CopyNotExistingFile.proj(5,4): error MSB3021: Unable to copy file "C:\lalala.bum" to "C:\tralala.bam". Could not find file 'C:\lalala.bum'. 
Done Building Project "C:\Users\elena\CopyNotExistingFile.proj" (default targets) -- FAILED. 
ElenasTarget: 
    BuildFailed=False 
Done Building Project "C:\Users\elena\mytest.proj" (default targets). 

Build succeeded. 

私の期待がHasLoggedErrorstrueに設定されますました。



1つの方法は、1つは(つまり、$(MSBuildProjectFile))が、別のターゲットでカスタムMSBuildWrapperタスク自体を指すを起動し、あなたのDefaultTargets例えば、自己が異なるターゲットとを構築することです

私はすでにそれを試しました(これは私の記事で私の調査の意味でした)。残念ながら、それは(私はあなたが理論でを言っ承知しています)
:-(いずれかの動作しません 私の新しい単一プロジェクトは次のようになります。

<?xml version="1.0" encoding="utf-8" ?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="ElenasTarget" ToolsVersion="4.0"> 

    <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\MyCompany.Tools.MSBuild.Tasks.dll" TaskName="MSBuildWithHasLoggedErrors" /> 

    <Target Name="ElenasTarget"> 
     <MSBuildWithHasLoggedErrors Projects="$(MSBuildProjectFile)" Targets="CopyNotExistingFile" ContinueOnError="true" > 
      <Output TaskParameter="HasLoggedErrors" PropertyName="BuildFailed" /> 
     </MSBuildWithHasLoggedErrors> 

     <Message Text="BuildFailed=$(BuildFailed)" /> 
    </Target> 

    <Target Name="CopyNotExistingFile" > 
     <Copy SourceFiles="C:\lalala.bum" DestinationFiles="C:\tralala.bam" /> 
    </Target> 
</Project> 

私はこのプロジェクトをビルドする場合HasLoggedErrorsはまだでしょうfalseに設定してください
(さらに、私の現在の "本当の"ビルドは、ターゲットを持ついくつかのプロジェクトファイルを含んでいますので、すべて1つのプロジェクトファイルにまとめることはできません)

私の最後の望みだった

またはカスタムロガーを書いて、コマンドラインを通すこと


私の "本当の"ビルドにはがあります。コマンドラインを通過したカスタムロガーがあります(わかりやすくするために私のテストプロジェクトには使用しませんでした)。実際にログ(XMLファイル)を生成しています。エラーが記録されているかどうかを調べるために解析します。
ところで、私はコンソールロガーが一種の「グローバル」ロガーだと思っていました。私は間違っていますか?

とにかく、カスタムロガーは役に立ちません。Log.HasLoggedErrorsはまだfalseに設定されています。
エラーが記録されているかどうか尋ねるために、特定のロガー(たとえば、カスタムロガー)を参照する方法がありますか?

実際にはLogは個々のターゲットにスコープが設定されているようです。

ええと...もしbuildengineインスタンスの反映が最後の手段なら、私はまだログの解析を好むでしょう。
(私を責めないでください:-)!)私は私の最初の解決策に固執することを決定したいくつかの調査の後


私の決断
:ビルドが失敗したかどうかを確認するためにログを解析。

私のコメントを確認して、なぜこれまでの提案が提供されたかを確認してください。

誰かが他のいくつかのアイデアを持っている場合

:-)共有することを躊躇しない(そうでなければ、この質問を閉じることができ、私は...と仮定)

答えて