2009-08-21 14 views

risposta

12

L'elemento di destinazione ha un attributo OnError che è possibile impostare su una destinazione da eseguire in caso di errore, ma poiché viene eseguito solo se la destinazione è in errore, risolve solo metà dello scenario.

Avete considerato di concatenare gli obiettivi per rappresentare i "passaggi" di test che si desidera eseguire?

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

L'obiettivo 'TestInitialization' è dove si può eseguire qualsiasi inizializzazione di test, il target 'Test' esegue il test, l'obiettivo di 'TestCleanup' non alcun tipo di test post ripulire.

Poi, eseguire questi obiettivi utilizzando il compito CallTarget, utilizzando l'attributoRunEachTargetSeparately impostato Vero. Questo eseguirà tutti gli obiettivi, indipendentemente dal successo o dall'errore.

Il campione completo è qui sotto:

<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

Appena arrivato a testare questo ora, e funziona perfettamente. Grazie per l'esempio piuttosto completo. – ripper234

+0

np! Felice che abbia funzionato! –

+1

Buona risposta, anche se sarebbe bello sapere come 'ripensare', per continuare l'analogia try/finally. Potrebbe essere necessario eseguire la pulizia, a prescindere da cosa, ma la costruzione continua a fallire. –

0

Oppure utilizzare <OnError> per chiamare la destinazione in caso di errore e DependsOnTargets o CallTarget per chiamare la stessa destinazione nel caso normale.