16/7/2010 13:11 El Bruno

[MSBUILD] HowTo: Utilizar propiedades del tipo ITaskItem en un en una tarea personalizada para TFSBuild

image47dd1de4

Buenas,

muchas veces cuando se publican ejemplos de tareas personalizadas para TFS2008, vemos como en las mismas se implementan propiedades “simples” para pasar información a la tarea o para que la misma retorne algo. Cuando tenemos que trabajar con listas (o vectores) de información, es necesario implementar una propiedad del tipo ITaskItem. Estas propiedades son bastante comunes en MSBuild, aunque trabajar con ellas es un poco delicado.

Por ejemplo, el siguiente script de MSBuild, se ejecutará en un servidor TFSBuild 2008. En el mismo, en el Target inicial de trabajo que poseemos [BeforeEndToEndIteration], se invoca a un target personalizado [TestStringConcatenate]. En este target, creamos un ItemGroup, con varios elementos dentro del mismo (líneas 10 a 15), y luego invocamos una tarea personalizada que concatena el valor de las cadenas de los elementos del ItemGroup y retorna un único string que se almacena en una propiedad llamada [StringResult] (línea 20). Finalmente, se muestra el resultado de esta propiedad en el log del build (líneas 23 a 25).

 

   1: <Target Name="BeforeEndToEndIteration">
   2:     <CallTarget Targets="TestStringConcatenate" />
   3:     <Error Text="Stop build"></Error>
   4: </Target>
   5: <Target Name="TestStringConcatenate" >
   6:    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
   7:               BuildUri="$(BuildUri)" Status="Succeeded"
   8:               Message="INICIO [TestStringConcatenate]. Prueba de StringConcatenate" />
   9:     <!-- Crea un ITEMGROUP de ejemplo -->
  10:     <ItemGroup>
  11:       <TestSC Include="Bruno" />
  12:       <TestSC Include="Valentino" />
  13:       <TestSC Include="Martina" />
  14:       <TestSC Include="Gatito .Net" />
  15:     </ItemGroup>
  16:  
  17:     <!—Concatena cadenas -->
  18:     <ElBruno.StringConcatenate Items="@(TestSC)"
  19:                                Separator=”;” AppendLine="true">
  20:       <Output TaskParameter="StringResult" PropertyName="StringResult" />
  21:     </ElBruno.StringConcatenate>
  22:  
  23:     <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
  24:                BuildUri="$(BuildUri)" Status="Succeeded"
  25:                Message="-Resultado String Concatenate: [$(StringResult)]" />
  26:  
  27:     <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
  28:                BuildUri="$(BuildUri)" Status="Succeeded"
  29:                Message="-- FIN." />
  30: </Target>

 

La tarea personalizada [ElBruno.StringConcatenate], recibe la lista de elementos en una propiedad llamada [Items], y además otra propiedad “simple” de tipo Bool llamada [AppendLine] y otra propiedad “simple” de tipo string llamada [Separator], para definir si se agrega un salto de linea entre cada elemento.

El código de la tarea personalizada es el siguiente (quejas al margen, que ha sido picado en segundos !!! ^^)

 

   1: using Microsoft.Build.Utilities;
   2: using Microsoft.Build.Framework;
   3: using System.Collections.Generic;
   4: using System.Text;
   5: namespace ElBruno.TfsBuild
   6: {
   7:     public class StringConcatenate : Task
   8:     {
   9:         #region TFS Task Properties
  10:         /// <summary>
  11:         /// Gets or sets the separator.
  12:         /// </summary>
  13:         /// <value>The separator.</value>
  14:         public string Separator { get; set; }
  15:         /// <summary>
  16:         /// Gets or sets a value indicating whether [append line].
  17:         /// </summary>
  18:         /// <value><c>true</c> if [append line]; otherwise, <c>false</c>.</value>
  19:         public bool AppendLine { get; set; }
  20:         /// <summary>
  21:         /// Gets or sets the items.
  22:         /// </summary>
  23:         /// <value>The items.</value>
  24:         public ITaskItem[] Items { get; set; }
  25:         /// <summary>
  26:         /// Gets or sets the string result.
  27:         /// </summary>
  28:         /// <value>The string result.</value>
  29:         [Output]
  30:         public string StringResult { get; set; }
  31:         #endregion
  32:  
  33:         #region TFS Override members
  34:         /// <summary>
  35:         /// Executes this instance.
  36:         /// </summary>
  37:         /// <returns></returns>
  38:         public override bool Execute()
  39:         {
  40:             bool ret = true;
  41:             var sb = new StringBuilder();
  42:             if (Items != null)
  43:             {
  44:                 for (int i = 0; i < Items.Length; i++)
  45:                 {
  46:                     sb.Append(Items[i].ItemSpec);
  47:                     if (i < Items.Length - 1)
  48:                     {
  49:                         sb.Append(Separator);
  50:                         if (AppendLine)
  51:                             sb.AppendLine();
  52:                     }
  53:                 }
  54:             }
  55:             StringResult = sb.ToString();
  56:             return ret;
  57:         }
  58:         #endregion
  59:     }
  60: }

 

Cuando ejecutamos la tarea en un servidor TFS2008, podremos ver como la misma muestra los resultados esperados, con los strings concatenados utilizando un salto de línea y un punto y coma.

 

Clipboard02

Apuntado … en la época de TFS2010, para proyectos de TFS2008 :P

 

Saludos @ Here

El Bruno

Archivado en: ,,,
Comparte este post: