Usar el mismo destino en varios archivos de proyecto

Si ha creado varios archivos de proyecto con MSBuild, es posible que haya detectado la necesidad de utilizar las mismas tareas y destinos en los distintos archivos de proyecto. En lugar de incluir la descripción completa de estas tareas o destinos en cada archivo de proyecto, puede guardar un destino en un archivo de proyecto independiente y, a continuación, importarlo en un proyecto que necesite utilizar dicho destino.

Usar el elemento Import

El elemento Import se utiliza para insertar un archivo de proyecto en otro archivo de proyecto. El archivo de proyecto que se importa debe ser un archivo de proyecto de MSBuild válido y contener XML con formato correcto. El atributo Project especifica la ruta de acceso al archivo de proyecto importado. Para obtener más información sobre el elemento Import, vea Elemento Import (MSBuild).

Para importar un proyecto

  1. En el archivo de proyecto de importación, defina todas las propiedades y elementos utilizados como parámetros para las propiedades y elementos del proyecto importado.

  2. Utilice el elemento Import para importar el proyecto. Por ejemplo:

    <Import Project="MyCommon.targets"/>

  3. A continuación del elemento Import, defina todas las propiedades y elementos que deben reemplazar las definiciones predeterminadas de las propiedades y los elementos del proyecto importado.

Orden de evaluación

Cuando MSBuild alcanza un elemento Import, el proyecto importado se inserta de manera efectiva en el proyecto de importación en la ubicación del elemento Import. Por tanto, la ubicación del elemento Import puede afectar a los valores de propiedades y elementos. Es importante comprender las propiedades y elementos que especifica el proyecto importado, así como las propiedades y los elementos que utiliza dicho proyecto.

Cuando se compila el proyecto, primero se evalúan todas las propiedades y después, los elementos. Por ejemplo, en el código XML siguiente se define el archivo de proyecto importado MyCommon.targets:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyCommon</Name>
    </PropertyGroup>

    <Target Name="Go">
        <Message Text="Name=$(Name)"/>
    </Target>
</Project>

En el código XML siguiente se define MyApp.proj, que importa MyCommon.targets:

<Project
    DefaultTargets="Go"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyApp</Name>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>

Cuando se compila el proyecto, se muestra el mensaje siguiente:

Name="MyCommon"

Dado que el proyecto se importa una vez definida la propiedad Name en MyApp.proj, la definición de Name en MyCommon.targets reemplaza la definición en MyApp.proj. Si se importara el proyecto antes de definir la propiedad Name, la compilación mostraría el siguiente mensaje:

Name="MyApp"

Utilice el enfoque siguiente al importar los proyectos

  1. En el archivo de proyecto, defina todas las propiedades y los elementos utilizados como parámetros para las propiedades y los elementos del proyecto importado.

  2. Importe el proyecto.

  3. En el archivo de proyecto, defina todas las propiedades y los elementos que deben reemplazar las definiciones predeterminadas de propiedades y elementos del proyecto importado.

Ejemplo 1

En el ejemplo de código siguiente se muestra el archivo MyCommon.targets importado por el segundo ejemplo de código. El archivo .targets evalúa las propiedades del proyecto de importación para configurar la compilación.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
        <Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
        <appname>$(MSBuildProjectName)</appname>
    <PropertyGroup>
    <Target Name="Build">
        <Csc Sources="hello.cs"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe"/>
    </Target>
</Project>

Ejemplo 2

En el ejemplo de código siguiente se importa el archivo MyCommon.targets.

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor>RETAIL</Flavor>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>