2009-08-21 5 views
10

Testターゲットが成功したか失敗したかにかかわらず(C#/ Javaのtry...finallyのような)、 "Test"ターゲットの実行後に特定のクリーンアップタスクを実行するにはどうしたらいいですか?try ...最終的にMsBuildで同等

答えて

12

ターゲット要素にはOnError属性がありますが、エラー時に実行するターゲットに設定できますが、ターゲットにエラーがある場合にのみ実行されるため、シナリオの半分しか解決できません。

ターゲットを連鎖して実行したいテストのステップを表すと考えましたか?

<PropertyGroup> 
    <TestSteps>TestInitialization;Test;TestCleanup</TestSteps> 
</PropertyGroup> 

あなたはすべてのテストの初期化を行うことができる場所「TestInitialization」標的である「試験」の目標は、テストを実行し、「TestCleanup」ターゲットはポストテストの任意の並べ替えは、クリーンアップありません。

はその後、に設定RunEachTargetSeparately属性を使用して、CallTargetタスクを使用して、これらの目標を実行します。成功または失敗に関係なく、すべてのターゲットが実行されます。

完全なサンプルは以下の通りです:

<Project DefaultTargets = "TestRun" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 

    <!-- Insert additional tests between TestInitialization and TestCleanup as necessary --> 
    <PropertyGroup> 
     <TestSteps>TestInitialization;Test;TestCleanup</TestSteps> 
    </PropertyGroup> 

    <Target Name = "TestRun"> 

     <CallTarget Targets="$(TestSteps)" RunEachTargetSeparately="True" /> 

    </Target> 

    <Target Name = "TestInitialization"> 
     <Message Text="Executing Setup..."/> 
    </Target> 

    <Target Name = "Test"> 
     <Message Text="Executing Test..."/> 

     <!-- this will fail (or should unless you meet the conditions below on your machine) --> 
     <Copy 
      SourceFiles="test.xml" 
      DestinationFolder="c:\output"/> 
    </Target> 

    <Target Name = "TestCleanup"> 
     <Message Text="Executing Cleanup..."/> 
    </Target> 

</Project> 
+0

これを今すぐテストしたところ、完全に動作します。むしろ完全な例をありがとう。 – ripper234

+0

np!それはうまくいった! –

+1

良い答えですが、try/finallyの類推を続けるためには、 "rethrow"する方法を知っておくと良いでしょう。クリーンアップは何を実行する必要がありますが、ビルドはまだ失敗します。 –

0

または通常の場合には、あなたと同じターゲットを呼び出すために、あなたのエラーの場合の目標、およびDependsOnTargetsまたはCallTargetを呼び出すために<OnError>を使用しています。

関連する問題