Objetivos de MSBuild

Actualización: noviembre 2007

Los destinos agrupan las tareas entre si en un orden concreto y permiten llamar a las secciones del proceso de generación desde la línea de comandos. Los destinos se agrupan a menudo en secciones lógicas para permitir la expansión del archivo de proyecto y aumentar la legibilidad. Por ejemplo, un destino podría eliminar todos los archivos del directorio de salida a fin de prepararlo para la generación, y otro compilar las entradas del proyecto y colocarlas en el directorio vacío.

Declarar destinos en el archivo de proyecto

Los destinos se declaran en el archivo de proyecto con el elemento Target. Por ejemplo, el código XML siguiente crea un destino denominado Compile que, a continuación, llama a la tarea Csc con la colección de elementos Compile.

<Target Name="Compile>
    <Csc Sources="@(Compile)" />
</Target>

Los destinos también pueden utilizar el atributo Condition. Si la condición especificada se evalúa como false, el destino no se ejecutará y el motor de MSBuild no ejecutará los destinos especificados en el atributo DependsOnTargets. Para obtener más información sobre las condiciones, vea Condiciones de MSBuild.

Análisis de dependencia

En escenarios más avanzados, los destinos pueden describir relaciones entre ellos y llevar a cabo análisis de dependencia, lo que permite omitir secciones completas en el proceso de generación si dicho destino está actualizado. Puede declarar los destinos que se deben ejecutar antes que un destino concreto utilizando el atributo DependsOnTargets. Cuando se ejecuta un destino, el motor de MSBuild ejecutará automáticamente cualquier destino mostrado primero en este atributo. Para obtener más información, vea Cómo: Generar versiones incrementalmente.

Nota:

Un destino nunca se ejecutará dos veces durante una única generación. Cuando se ejecuta, se asume que el destino ha terminado su trabajo y no se volverá a ejecutar, aunque un destino subsiguiente dependa de él.

Procedimientos recomendados

Desglosar de este modo el archivo de proyecto permite cambiar secciones del archivo sin que ello afecte a las demás. Por ejemplo, una manera de generar un proyecto con recursos es colocar las tareas GenerateResource y Csc en el mismo destino, por ejemplo:

<Target Name="Build">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Con este enfoque, el proyecto se genera como debe, pero el destino se convierte en algo excesivamente voluminoso y sin flexibilidad. Si más adelante quisiera agregar otras tareas que se ejecuten entre GenerateResource y Csc, resultaría muy difícil leer el archivo de proyecto si todas estuvieran en el mismo destino. Además, crear destinos de semejante tamaño con tantas tareas dificulta la realización de generaciones incrementales correctas (aquéllas en que sólo se vuelven a generar los destinos que antes no se hayan generado o los que no estén actualizados). Los destinos de gran tamaño también impiden la ejecución de destinos para realizar tareas concretas. En el ejemplo anterior, no hay ninguna manera de generar los recursos sin compilar.

Una forma más apropiada de crear un archivo de proyecto es utilizar varios destinos y expresar las dependencias entre ellos de manera explícita. Este enfoque permite, además, ejecutar cualquiera de los destinos por separado y realizar un conjunto de tareas más reducido, en lugar de ejecutar una larga lista de ellas en el mismo destino cada vez que se efectúa la generación. En este ejemplo, cada tarea se encuentra en un destino independiente y el atributo DependsOnTargets especifica que el destino Resources se tiene que ejecutar antes que el destino Build.

<Target Name="Resources">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
</Target>

<Target Name="Build" DependsOnTargets="Resources">
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Vea también

Tareas

Cómo: Especificar qué destino utilizar primero al generar

Cómo: Utilizar el mismo destino en varios archivos de proyecto

Conceptos

Información general sobre MSBuild

Otros recursos

Conceptos de MSBuild