Orden de compilación de destinos

Los destinos se deben ordenar si la entrada a un destino depende de la salida de otro destino. Hay varias maneras de especificar el orden en el que se ejecutan los destinos.

  • Destinos iniciales

  • Destinos predeterminados

  • Primer destino

  • Dependencias de destinos

  • BeforeTargets y AfterTargets (MSBuild 4.0)

Un destino nunca se ejecuta dos veces durante una compilación, aunque un destino subsiguiente en la compilación dependa de él. Una vez ejecutado un destino, su contribución a la compilación se ha completado.

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, vea Condiciones de MSBuild.

Destinos iniciales

El elemento Project tiene un atributo InitialTargets opcional cuyo valor puede ser una lista de destinos ordenada delimitada por punto y coma. Por ejemplo,

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

especifica que se ejecuta el destino Warm, y a continuación, se ejecuta el destino Eject.

Los proyectos importados pueden tener sus propios atributos InitialTargets. Todos los destinos iniciales se agregan formando un conjunto y se ejecutan en orden. Se utilizan normalmente para la comprobación de errores.

Los destinos iniciales se pueden invalidar utilizando la línea de comandos. Por ejemplo,

msbuild /target:Build;Report

especifica que se ejecuta el destino Build, y a continuación, se ejecuta el destino Report. Cuando los destinos se especifican de esta manera, los destinos iniciales se omiten.

Para obtener más información, vea Cómo: Especificar qué destino utilizar primero al generar.

Destinos predeterminados

El elemento Project también tiene un atributo DefaultTargets opcional cuyo valor puede ser una lista de destinos predeterminados ordenada delimitada por punto y coma. Por ejemplo,

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

especifica que se ejecuta el destino Clean, y a continuación, se ejecuta el destino Build.

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

Los destinos predeterminados se pueden invalidar utilizando la línea de comandos. Por ejemplo,

msbuild /target:Build;Report

especifica que se ejecuta el destino Build, y a continuación, se ejecuta el destino Report. Cuando los destinos se especifican de esta manera, los destinos predeterminados se omiten.

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

Primer destino

Si no hay destinos iniciales, destinos predeterminados o destinos de la línea de comandos, MSBuild ejecutará el primer destino que encuentre en el archivo del proyecto o en cualquier archivo del proyecto importado.

Dependencias de destinos

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 del destino Chop y del destino Cook. MSBuild ejecuta el destino Chop y a continuación, ejecuta el destino Cook antes de ejecutar el destino Serve.

BeforeTargets y AfterTargets

En MSBuild 4.0, puede especificar el orden de destinos utilizando los atributos AfterTargets y BeforeTargets.

Considere el script siguiente.

<Project DefaultTargets="Compile;Link" xmlns="https://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 Optimize intermedio que se ejecute después del destino Compile pero antes que el destino Link, agregue el destino siguiente en cualquier parte del elemento Project.

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

Determinar el orden de compilación de destinos

MSBuild determina el orden de compilación de destinos del modo siguiente:

  1. Se ejecutan los destinos especificados en la línea de comandos por el modificador /target. Si no se especifican destinos, se ejecutan los destinos InitialTargets y, a continuación, los destinos DefaultTargets. Si ninguno de ellos está presente, se ejecuta el primer destino que se encuentre.

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

  3. Antes de que se ejecute un destino, se ejecutan sus destinos DependsOnTargets.

  4. Antes de que se ejecute un destino, se ejecuta cualquier destino que lo enumere en un atributo BeforeTargets.

  5. Antes de que se ejecute un destino, se comparan sus atributos Inputs y Outputs. Si MSBuild determina que los archivos de salida no están actualizados con respecto al archivo o archivos de entrada correspondientes, MSBuild ejecuta el destino. De lo contrario, MSBuild omite el destino.

  6. Después de ejecutarse u omitirse un destino, se ejecuta cualquier destino que lo enumere en un atributo AfterTargets.

Vea también

Conceptos

Objetivos de MSBuild