4/11/2010 18:39
El Bruno
[MSBUILD] Aplicando principios de diseño en nuestros archivos MSBuild, que nos llevarán a trabajar en la línea de comandos (Back to the Past)

Buenas,
cuando los archivos de MSBuild comienzan a ser más grandes que lo que aconseja el sentido común, pues es una buena idea, separar los mismos en varios archivos y además separar los MSBuild Targets en Targets más pequeños. Vamos que los mismos principios SOLID que aplicamos cuando escribimos código, deberíamos intentar aplicar en el diseño y construcción de nuestros archivos de MSBuild (ojo, que no soy un inconsiente y sé que MSBuild es poco más que un lenguaje, pero por pedir que no falte). Pero bueno, cuando empezamos a separar y a aislar los targets, también nos encontramos en la situación de querer probar el funcionamiento de los mismos de manera aislada y esto puede complicarse, principalmente por la naturaleza de MSBuild, donde es muy común que para invicar a un Target necesites una serie de propiedades o Items con valores ya establecidos.
Supongamos que tenemos el siguiente proyecto MSBuild.
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
2: ToolsVersion="4.0">
3: <Target Name="Target1">
4: <Message Text="Mensaje 1: $(Nino)"/>
5: </Target>
6: <Target Name="Target2">
7: <Message Text="Mensaje 2: $(Nino)"
8: Condition="'$(Nina)'=='Martina'"/>
9: </Target>
10: </Project>
Si ejecutamos el mismo desde la línea de comandos veremos un resultado similar al siguiente, donde el primer target se ejecuta, pero en ningún momento estamos definiendo la propiedad $(Nino) para mostrar el valor de la misma.

Para asignar un valor a esta propiedad, sin tener que modificar el proyecto, simplemente utilizamos la opción /propertyName en la llamada, por ejemplo:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>msbuild "C:\srcBruno\Agile01\MsBuild Tests\CmdInvokeProperties_01.targets" /property:Nino=Valentino
Si ejecutamos el comando veremos como la tarea que muestra el mensaje, muestra el valor de la propiedad

Si ahora queremos probar el Target2, y además agregar otra propiedad para que la condición (línea 8) sea válida, pues también utilizamos la opción /target, por ejemplo:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>msbuild "C:\srcBruno\Agile01\MsBuild Tests\CmdInvokeProperties_01.targets" /target:Target2 /property:Nino=Valentino;Nina=Martina
El resultado de la ejecución ejecuta el segundo Target y además interpreta como válida la condicion.

Este HACK es mu simple, pero puede sacarnos de más de un problema al momento de trabajar e intentar probar nuestros MSBuild Targets.
La referencia completa de la línea de comandos se puede consultar aquí.
Saludos @ Here
El Bruno

Archivado en: Visual Studio 2010,HowTo,Code Sample,MSBuild
Comparte este post: