19

ho definito diversi AfterBuild - Compiti nel mio progetto di Visual Studio con condizioni diverse:Ordine delle attività di AfterBuild nei progetti di Visual Studio ...?

<Target Name="AfterBuild" Condition="'$(Configuration)'=='FinalBuilder'"> 
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
</Target> 

Ma solo l'ultimo viene eseguito se la condizione partita. Se scelgo FinalBuilder-Configuration, le attività di AfterBuild vengono ignorate e non eseguite. Se cambio l'ordine dei target nei file di progetto (Condition = "'$ (Configuration)' == 'FinalBuilder'" come ultimo), viene eseguito l'AfterBuild per FinalBuilder-Configuration ma quello per MvcBuildViews viene ignorato.

L'ordine del target è importante? Viene presa in considerazione solo l'ultima attività di AfterBuild? O come posso definire diverse attività di AfterBuild con condizioni diverse?

Grazie

Konrad

risposta

30

L'unico secondo viene eseguito perché è stato ridefinito. Vedi MSDN (Dichiarare le destinazioni nel capitolo del file di progetto).

Si dovrebbe usare solo un obiettivo AfterBuild nel file di progetto come questo:

<Target Name="AfterBuild" > 
    <Message Condition="'$(MvcBuildViews)'=='true'" Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
    <Message Condition="'$(Configuration)'=='FinalBuilder'" Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 

EDIT: Oppure utilizzare CallTarget compito:

<Target Name="AfterBuild" > 
    <CallTarget Condition="'$(MvcBuildViews)'=='true'" Targets="MvcBuildTarget" /> 
    <CallTarget Condition="'$(Configuration)'=='FinalBuilder'" Targets="FinalBuilderTarget" /> 
</Target> 

<Target Name="MvcBuildTarget"> 
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
</Target> 

<Target Name="FinalBuilderTarget" > 
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 
+0

Grazie. Sono un modo per nidificare blocchi per ogni condizione, in modo da non dover scrivere la clausola Condition in ogni singolo elemento? – Konrad

+0

È possibile utilizzare l'attività CallTaget. Ho aggiornato la mia risposta. – Ludwo

+0

Oh grazie ... perfetto :-) – Konrad

2

Se avete veramente bisogno di eseguire più compiti AfterBuild (questo può essere il caso ad esempio se hai bisogno di diversi set di input e output per ogni attività) puoi usare DependsOnTarget per fare in modo che AfterBuild dipenda da tutti loro:

<Target Name="AfterBuild1" 
    Inputs="stuff" 
    Outputs="stuff"> 
     <Message Text="Running first after build task." Importance="high" /> 
     <Exec Command="stuff" /> 
    </Target> 
    <Target Name="AfterBuild2" 
    Inputs="other stuff" 
    Outputs="other stuff"> 
     <Message Text="Running other after build task." Importance="high" /> 
     <Exec Command="stuff" /> 
    </Target> 
    <Target Name="AfterBuild" DependsOnTargets="AfterBuild1;AfterBuild2" /> 

Se è necessario vincolare il proprio ordine, è sufficiente impostare AfterBuild2 su AfterBuild1 con DependsOnTargets="AfterBuild1".

Problemi correlati