[MSBuild] Crear y depurar una task personalizada

Hola a todos, vengo a hablar de una cosa que es tan sumamente sencilla que no haría falta escribir sobre ella, pero justamente por eso vamos a describirla. Vamos a crear una task personalizada para que nuestras builds automatizadas del VSTFS las ejecuten por nosotros.

Lo primero sería deciros que las task sirven para casi cualquier cosa que se nos ocurra en nuestras build, en mi caso particular la última vez que hice una era para sustituir un fichero .bat que organizaba unos ficheros de salida y claro con el task realmente hacia lo mismo, pero era más versátil y molaba más.

 

Crear una task

Esto es lo más sencillo, creamos un proyecto de tipo class library (por poner un ejemplo), y añadimos las siguientes referencias:

  • Microsoft.Build.Framework (en mi caso la versión 3.5)
  • Microsoft.Build.Utilities.v3.5

Generamos una clase y la hacemos heredar de “Task” (que se encuentra en Microsoft.Build.Utilities). Realizamos una implementación del método “Execute” de la base y listo, ya tenemos nuestra task personalizada.

Quedaría algo similar a esto,

using Microsoft.Build.Utilities;

namespace TestTask
{
public class HolaNombreTask : Task
{
public override bool Execute()
{
Log.LogMessage("Hola Mario!!!");
return true;
}
}
}

 

Notad que no he usado el hola mundo, he usado hola Mario porque soy un poco egocéntrico (aunque me contento con poquillo)

 

Añadir parámetros obligatorios

Ya tendríamos el task, ahora lo ideal es pasarle algún que otro parametrillo, la forma es igual de fácil, sólo tenemos que añadir una propiedad pública y ya lo tendríamos.

Vamos a añadir un parámetro obligatorio para que se indique un nombre.

Al final el código quedaría cómo sigue,

using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

namespace TestTask
{
public class HolaNombreTask : Task
{
[Required]
public string Nombre { get; set; }

public override bool Execute()
{
Log.LogMessage("Hola " + Nombre);
return true;
}
}
}

Vamos a ver cómo se depura esto a través del visual studio, porque lo que interesa es que se ejecute a través de msbuild, no probar el método que vemos que es muy sencillo y no debería fallar…

 

Depurar task con msbuild

Necesitaremos generar un xml que pueda leer el msbuild y que haga ejecutar nuestra task. Así que creamos un nuevo fichero xml (testtask.xmldebug) con el siguiente contenido

<?xml version="1.0" encoding="utf-8" ?>
<Project DefualtTargets="Debug" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="HolaNombreTask" AssemblyFile = "C:TestTaskbinDebugTestTask.dll" />
<Target Name="Debug">
<HolaNombreTask
Nombre="Mario!!!"
/>
</Target>
</Project>

 

 

A tener en cuenta, el tag “UsingTask” que evidentemente sirve para utilizar una task que esté en el ensamblado que le pongamos, en nuetro caso el que acabamos de generar, y poquito más, creo que está bastante claro el documentito xml.

 

Ahora tenemos que ir a las propiedades de nuestro proyecto, a la “pestaña” Debug y,

  • Marcamos la opción de “Start external program:” y buscamos el MSBuild.exe que normalmente se encuentra en %windir%Microsoft.NETv3.5MSBuild.exe
  • Y en “Command line argumetns” ponemos la dirección dónde se encuentra el fichero xml que hemos generado, en el caso del ejemplo (“C:TestTasktesttask.xmldebug”)
  • Ponemos algún puntico de parada si queremos
  • Pulsamos F5 y ya está…

 

Ya tenemos nuestra task funcionando y depurándola a nuestro gusto.

Como podéis observar es super sencillo generar nuevas task.

 

Un saludico y hasta la próxima.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *