19

he definido varios AfterBuild - Tareas en mi proyecto de Visual Studio con diferentes condiciones:¿Orden de tareas de AfterBuild en proyectos de 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> 

Pero sólo el último se ejecuta si el partido de estado. Si elijo la configuración de FinalBuilder, las tareas de AfterBuild se ignoran y no se ejecutan. Si cambio el orden de los Objetivos en los archivos del proyecto (Condition = "'$ (Configuration)' == 'FinalBuilder'" como último), se ejecuta AfterBuild para FinalBuilder-Configuration pero se ignora el de MvcBuildViews.

¿Es importante el orden del objetivo? ¿Solo se tiene en cuenta la última tarea de AfterBuild? ¿O cómo puedo definir diferentes tareas de AfterBuild con diferentes condiciones?

Gracias

Konrad

Respuesta

30

El único segundo se ejecuta, ya que se ha redefinido. Consulte MSDN (Declaración de objetivos en el capítulo del archivo de proyecto).

Debe utilizar un solo objetivo AfterBuild en su archivo de proyecto como este:

<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: O utilice CallTarget tarea:

<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

Gracias. ¿Son la forma de anidar bloques para cada condición, para que no tenga que escribir la cláusula de Condición en cada elemento? – Konrad

+0

Puede usar la tarea CallTaget. Actualicé mi respuesta. – Ludwo

+0

Oh gracias ... perfecto :-) – Konrad

2

Si realmente necesita para ejecutar varias tareas AfterBuild (este puede ser el caso, por ejemplo, si necesita diferentes conjuntos de entrada y salida para cada tarea) puede usar DependsOnTarget para hacer que AfterBuild dependa de todos ellos:

<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" /> 

Si necesita restringir su orden, simplemente haga que AfterBuild2 dependa de AfterBuild1 con DependsOnTargets="AfterBuild1".

Cuestiones relacionadas