31/8/2010 13:04
El Bruno
[MSBUILD] Incluyendo/importando archivos de proyectos externos (VII)

Buenas,
después de hablar de uno de los elementos que nos permiten modularizar la ejecución de nuestros proyectos de MSBuild: los MSBuild Targets, otra opción que poseemos es poder importar/incluir archivos de proyecto de MSBuild en otros archivos de proyectos. Para esto se utiliza la etiqueta <Import>. La misma permite incluir el contenido de un archivo externo dentro del archivo de proyecto en la que se define.
Por ejemplo, si existe un archivo en [C:\srcBruno\Agile01\MsBuild Tests\Imports_1.targets] con el siguiente contenido dentro del mismo:
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
2: <Target Name="TargetImport1">
3: <Message Text="Target Import 1" />
4: </Target>
5: </Project>
El ejemplo siguiente muestra como, desde un nuevo archivo de proyecto de MSBuild, es posible incluir el contenido de este archivo e invocar al MSBuild Target: TargetImport1 ( línea 3), e invocar al target definido en el archivo externo (línea 6).
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
2: InitialTargets="Target1">
3: <Import Project="C:\srcBruno\Agile01\MsBuild Tests\Imports_1.targets"/>
4: <Target Name="Target1">
5: <Message Text="Target 1" />
6: <CallTarget Targets="TargetImport1"></CallTarget>
7: </Target>
8: </Project>
La ejecución de este proyecto nos muestra como se ejecuta el mismo, con el target externo.
En este punto todo funciona, pero si eres una persona organizada seguramente te choca bastante que la ubicación del archivo externo necesite ser defina con el path completo. Para evitar este tipo de situaciones existen varias opciones.
El siguiente proyecto muestra una opción, en la que se define en una propiedad llamada $(SampleBuildLocation), el path con la ubicación de los archivos externos. Para definir el valor de esta propiedad, se crea un <PropertyGroup> (líneas 4 a 7), y dentro de la misma se realizan 2 acciones:
- En primer lugar (línea 5), se intenta definir relativamente la ubicación del directorio, utilizando una Condición (ya hablaré de las mismas más adelante) y el valor de la propiedad $(BuildPath).
- En segundo lugar (línea 6), se verifica el valor de la propiedad y si la misma es un string vacio, se define “en duro” el path con la ubicación de los archivos
A continuación, se realiza el <Import> del proyecto utilizando la propiedad $(SampleBuildCondition), y además se muestra el valor de las propiedades utilizadas en el MSBuild Target principal (líneas 10 y 11):
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
2: InitialTargets="Target1">
3: <!-- Imports de archivos de proyecto externos -->
4: <PropertyGroup>
5: <SampleBuildLocation Condition="Exists('$(BuildPath)\..\Tests\')">$(BuildPath)\..\Tests\</SampleBuildLocation>
6: <SampleBuildLocation Condition="'$(SampleBuildLocation)' == ''">C:\srcBruno\Agile01\MsBuild Tests\</SampleBuildLocation>
7: </PropertyGroup>
8: <Import Project="$(SampleBuildLocation)\Imports_1.targets"/>
9: <Target Name="Target1">
10: <Message Text="Build Path: $(BuildPath)" />
11: <Message Text="Sample Tfs Build: $(SampleBuildLocation)" />
12: <Message Text="Target 1" />
13: <CallTarget Targets="TargetImport1"></CallTarget>
14: </Target>
15: </Project>
La ejecución de este proyecto nos muestra como la propiedad $(BuildPath) no posee valor y además el valor con el que se arma el path para incluir el archivo externo.
Saludos @ Here
El Bruno (@elbruno en Twitter)
Archivado en: Visual Studio 2010,Build,Code Sample,Tutorial,MSBuild
Comparte este post: