Compartir a través de


Orden de compilación de destinos

Los destinos deben ordenarse si la entrada de 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 Project atributo especifica los destinos que se ejecutarán primero, incluso si se especifican destinos en la línea de comandos o en el DefaultTargets atributo .

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

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

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

En general, no debe depender del orden de declaración para especificar qué tareas se ejecutan antes de otras tareas.

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

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.

Destinos iniciales

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

El valor del InitialTargets atributo puede ser una lista ordenada de destinos delimitada por punto y coma. En el ejemplo siguiente se especifica que el Warm objetivo se ejecuta y, después, el Eject objetivo se ejecuta.

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

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

Para obtener más información, vea Cómo: Especificar el destino que se va a compilar primero.

Destinos predeterminados

El atributo DefaultTargets del elemento Project especifica qué objetivo u objetivos se compilan si no se especifica explícitamente un objetivo en una línea de comando.

El valor del DefaultTargets atributo puede ser una lista ordenada de destinos predeterminados delimitada por punto y coma. En el ejemplo siguiente se especifica que el Clean objetivo se ejecuta y, después, el Build objetivo se ejecuta.

<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 Build objetivo se ejecuta y, después, el Report objetivo se ejecuta. Al especificar destinos de esta manera, se omiten los destinos predeterminados.

msbuild -target:Build;Report

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

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

Para obtener más información, vea Cómo: Especificar el destino que se va a compilar primero.

Primer destino

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

Dependencias de destino

Los objetivos pueden describir las relaciones de dependencia mutuamente. El DependsOnTargets atributo indica que un destino depende de otros destinos. Por ejemplo

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

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

Nota:

Los destinos estándar del SDK definen una serie de propiedades que contienen la lista de DependsOn destinos que son dependencias para ese destino (por ejemplo, $(BuildDependsOn), $(CleanDependsOn), etc.). Por ejemplo

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">

Para personalizar un proyecto, puede invalidar las DependsOn propiedades con destinos personalizados adicionales que amplían el proceso de compilación, como se describe en Extensión del proceso de compilación de Visual Studio.

BeforeTargets y AfterTargets

Puede especificar el orden de destino mediante los BeforeTargets atributos y AfterTargets .

Tenga en cuenta el siguiente guion.

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

<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 ambosBeforeTargets y 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.

Determinar el orden de construcción objetivo

MSBuild determina el orden de construcción objetivo de la siguiente manera:

  1. InitialTargets se ejecutan objetivos.

  2. Los destinos especificados en la línea de comandos por el modificador -target se ejecutan. Si no especifica ningún destino en la línea de comandos, entonces se ejecutan los DefaultTargets destinos. Si ninguno de los dos está presente, se ejecuta el primer objetivo encontrado.

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

    Otros destinos que enumeran el destino condicional en BeforeTargets o AfterTargets se siguen ejecutando en el orden prescrito, independientemente del resultado de la condición.

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

    Nota:

    Un objetivo se considera omitido si no se ejecuta porque sus elementos de salida son up-to-date (consulte la sección de compilación incremental). Esta comprobación se realiza justo antes de ejecutar las tareas dentro del destino y no afecta al orden de ejecución de los destinos.

  5. Antes de ejecutar o omitir el destino, se ejecuta cualquier otro destino que muestre el destino en un BeforeTargets atributo.

  6. Antes de ejecutar el destino, se comparan sus Inputs atributos y Outputs atributos. Si MSBuild determina que los archivos de salida están desactualizados con respecto al archivo o los archivos de entrada correspondientes, entonces MSBuild ejecuta el objetivo. De lo contrario, MSBuild salta el objetivo.

  7. Una vez ejecutado o omitido el destino, se ejecuta cualquier otro destino que lo muestre en un AfterTargets atributo.