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 atributoProject
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 atributoDefaultTargets
.DefaultTargets
. Este atributoProject
especifica qué destinos se ejecutan si un destino no se especifica explícitamente en la línea de comandos.DependsOnTargets
. Este atributoTarget
especifica los destinos que se deben ejecutar antes de poder ejecutar este destino.BeforeTargets
yAfterTargets
. Estos atributosTarget
especifican que hay que ejecutar este destino 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 que otras tareas.
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
.
Nota:
Los destinos estándar del SDK definen una serie de propiedades DependsOn
que contienen la lista de 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 propiedades DependsOn
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
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 tanto BeforeTargets
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:
Se ejecutan los destinos
InitialTargets
.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.Se evalúa el atributo de destino
Condition
. Si el atributoCondition
está presente y se evalúa comofalse
, 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
oAfterTargets
se siguen ejecutando en el orden prescrito.Antes de ejecutar u omitir el destino, se ejecutan sus destinos de
DependsOnTargets
, a menos que el atributoCondition
se aplique al destino y se evalúe comofalse
.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.
Después de ejecutar u omitir el destino, se ejecuta cualquier otro destino que lo muestre en un atributo
BeforeTargets
.Antes de ejecutar el destino, se comparan los atributos
Inputs
yOutputs
. 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.Después de ejecutar u omitir el destino, se ejecuta cualquier destino que lo enumere en un atributo
AfterTargets
.