Cómo: Utilizar el mismo destino en varios archivos de proyecto
Actualización: noviembre 2007
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.
Utilizar 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 código XML 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
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.
Utilice el elemento Import para importar el proyecto. Por ejemplo:
<Import Project="MyCommon.targets"/>
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 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 genera 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=”https://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="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyApp</Name>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>
Cuando se genera 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 el proyecto se importa antes de definir la propiedad Name, la generación mostraría el siguiente mensaje:
Name="MyApp"
Utilice el enfoque siguiente al importar los proyectos
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.
Importe el proyecto.
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
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 generación.
<Project xmlns="https://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>
En el ejemplo de código siguiente se importa el archivo MyCommon.targets.
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>