Orden de compilación de destinos

Los destinos se deben ordenar si la entrada a un destino depende de la salida de otro destino. Puede usar estos atributos para especificar el orden en el que se ejecutan los destinos:

  • InitialTargets. Este atributo Project especifica los destinos que se ejecutarán en primer lugar, incluso si los destinos se especifican en la línea de comandos o en el atributo DefaultTargets.

  • DefaultTargets. Este atributo Project especifica qué destinos se ejecutan si un destino no se especifica explícitamente en la línea de comandos.

  • DependsOnTargets. Este atributo Target especifica los destinos que se deben ejecutar antes de poder ejecutar este destino.

  • BeforeTargets y AfterTargets. Estos atributos Target especifican que hay que ejecutar este destino antes o después de los destinos especificados.

Un destino nunca se ejecuta dos veces durante una compilación, incluso si un destino subsiguiente en la compilación depende de él. Una vez que se ha ejecutado un destino, su contribución a la compilación finaliza.

Los destinos pueden tener un atributo Condition. Si la condición especificada se evalúa como false, el destino no se ejecuta y no tiene ningún efecto en la compilación. Para obtener más información sobre las condiciones, consulte Condiciones.

Destinos iniciales

El atributo InitialTargets del elemento Project especifica los destinos que se ejecutarán en primer lugar, incluso si los destinos se especifican en la línea de comandos o en el atributo DefaultTargets. Los destinos iniciales se utilizan normalmente para la comprobación de errores.

El valor del atributo InitialTargets puede ser una lista delimitada por punto y coma, y ordenada de destinos. En el ejemplo siguiente se especifica que el destino Warm se ejecuta y, a continuación, se ejecuta el destino Eject.

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Los proyectos importados pueden tener sus propios atributos InitialTargets. Todos los destinos iniciales se agregan conjuntamente y se ejecutan en orden.

Para más información, consulte Cómo: Especificar qué destino utilizar primero al compilar.

Destinos predeterminados

El atributo DefaultTargets del elemento Project especifica qué destinos se compilan si un destino no se especifica explícitamente en la línea de comandos.

El valor del atributo DefaultTargets puede ser una lista delimitada por punto y coma, y ordenada de destinos predeterminados. En el ejemplo siguiente se especifica que el destino Clean se ejecuta y, a continuación, se ejecuta el destino Build.

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

Puede invalidar los destinos predeterminados mediante el modificador -target en la línea de comandos. En el ejemplo siguiente se especifica que el destino Build se ejecuta y, a continuación, se ejecuta el destino Report. Al especificar los destinos de esta manera, los destinos predeterminados se omiten.

msbuild -target:Build;Report

Si se especifican tanto destinos iniciales como destinos predeterminados y si no se especifica ningún destino de línea de comandos, MSBuild ejecuta los objetivos iniciales primero y, a continuación, ejecuta los destinos predeterminados.

Los proyectos importados pueden tener sus propios atributos DefaultTargets. El primer atributo DefaultTargets encontrado determina qué destinos predeterminados se ejecutarán.

Para más información, consulte Cómo: Especificar qué destino utilizar primero al compilar.

Primer destino

Si no hay destinos iniciales, destinos predeterminados ni destinos de línea de comandos, MSBuild ejecuta el primer destino que encuentra en el archivo del proyecto o en cualquier archivo del proyecto importado.

Dependencias de destino

Los destinos pueden describir relaciones de dependencia entre sí. El atributo DependsOnTargets indica que un destino depende de otros destinos. Por ejemplo,

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

indica a MSBuild que el destino Serve depende de los destinos Chop y Cook. MSBuild ejecuta el destino Chop y, a continuación, ejecuta el destino Cook antes de ejecutar el destino Serve.

BeforeTargets y AfterTargets

El orden de los destinos se puede especificar con los atributos BeforeTargets y AfterTargets.

Considere el script siguiente.

<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Para crear un destino intermedio Optimize que se ejecuta después del destino Compile, pero antes del destino Link, agregue el destino siguiente en cualquier lugar en el elemento Project.

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

Como alternativa, especifique el orden como

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

No es útil especificar tantoBeforeTargets como AfterTargets en el mismo destino. Como se describe en la sección siguiente, solo el primer destino encontrado hará que se ejecute el nuevo destino.

Determinación del orden de compilación de destino

MSBuild determina el orden de compilación de destinos como sigue:

  1. Se ejecutan los destinos InitialTargets.

  2. Se ejecutan los destinos especificados en la línea de comandos mediante el modificador -target. Si no se especifica ningún destino en la línea de comandos, se ejecutan los destinos DefaultTargets. Si ninguno está presente, se ejecuta el primer destino que se encuentre.

  3. Se evalúa el atributo de destino Condition. Si el atributo Condition está presente y se evalúa como false, el destino no se ejecuta y no tiene ningún efecto adicional en la compilación.

    Los otros destinos que enumeran el destino condicional en BeforeTargets o AfterTargets se siguen ejecutando en el orden prescrito.

  4. Antes de ejecutar u omitir el destino, se ejecutan sus destinos de DependsOnTargets, a menos que el atributo Condition se aplique al destino y se evalúe como false.

    Nota:

    Se considera que se omite un destino si este no se ejecuta porque sus elementos de salida están actualizados (vea la compilación incremental). Esta comprobación se lleva a cabo justo antes de ejecutar las tareas dentro del destino y no afecta al orden de ejecución de los destinos.

  5. Después de ejecutar u omitir el destino, se ejecuta cualquier otro destino que lo muestre en un atributo BeforeTargets.

  6. Antes de ejecutar el destino, se comparan los atributos Inputs y Outputs. Si MSBuild determina que los archivos de salida no están actualizados con respecto a los archivos de entrada correspondientes, MSBuild ejecuta el destino. De lo contrario, MSBuild omite el destino.

  7. Después de ejecutar u omitir el destino, se ejecuta cualquier destino que lo enumere en un atributo AfterTargets.