
Buenas,
en el post anterior comentaba sobre la capacidad de definir propiedades además de un poco de código para las Inline Tasks en MSBuild 4.0, pero claro, ahora que estamos trabajando con varias variables (definiciones en Xml, código C#, etc); pues es posible que nuestro código tenga errores. En el caso de que se disparen los mismos, el propio compilador de MSBuild, nos informará el detalle y además podremos ver el log de compilación, como si fuese un proyecto C#.
El siguiente proyecto posee un error en la línea 19, donde en el mismo falta un paréntesis para la instrucción Log.LogMessage().
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
2: ToolsVersion="4.0"
3: InitialTargets="Target1">
4: <Target Name="Target1">
5: <ParamSample Iteration="55"/>
6: </Target>
7: <UsingTask
8: TaskName="ParamSample"
9: TaskFactory="CodeTaskFactory"
10: AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
11: <ParameterGroup>
12: <Iteration ParameterType="System.Int32" />
13: </ParameterGroup>
14: <Task>
15: <Using Namespace="System"/>
16: <Code Type="Fragment" Language="cs">
17: <![CDATA[
18: for(int i = 0; i < Iteration; i++)
19: Log.LogMessage("i: " + i.ToString();
20: ]]>
21: </Code>
22: </Task>
23: </UsingTask>
24: </Project>
Cuando ejecutamos el mismo podemos ver el siguiente output en la consola
Si analizamos con mas detalle el log podremos ver el siguiente mensaje
C:\srcBruno\Agile01\MsBuild Tests\InlineTasks_05.targets(5,5): error : The source file for this compilation can be found at:
"C:\Users\bruno\AppData\Local\Temp\1\MSBUILDCodeTaskFactoryGeneratedFilecd57c802-3029-4b97-819e-0f177561737c.txt"
C:\srcBruno\Agile01\MsBuild Tests\InlineTasks_05.targets(5,5): error MSB3758: An error has occurred during compliation. c:\Users\bruno\AppData\Local\Temp\1\zq
mzud02.0.cs(49,38) : error CS1026: ) expected
C:\srcBruno\Agile01\MsBuild Tests\InlineTasks_05.targets(5,5): error MSB4175: The task factory "CodeTaskFactory" could not be loaded from the assembly "C:\Win
dows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll". Object reference not set to an instance of an object.
Que traducido a errores humanos es algo así:
- Se dispara un error en la línea 5, que es la línea de invocación a la tarea autocontenida.
- El código C# que se ha intentado compilar está en un archivo temporal en [c:\Users\bruno\AppData\Local\Temp\1\zqmzud02.0.cs]
- La línea del error es (49,38)
- El error es: error CS1026: ) expected
Si editamos el archivo temporal de código fuente, que se genera para la tarea autocontenida podremos ver la estructura completa de la clase que se genera para la Inline Task:
1: //------------------------------------------------------------------------------
2: // <auto-generated>
3: // This code was generated by a tool.
4: // Runtime Version:4.0.30319.1
5: //
6: // Changes to this file may cause incorrect behavior and will be lost if
7: // the code is regenerated.
8: // </auto-generated>
9: //------------------------------------------------------------------------------
10:
11: namespace InlineCode {
12: using System;
13: using System.Collections;
14: using System.Collections.Generic;
15: using System.Text;
16: using System.Linq;
17: using System.IO;
18: using Microsoft.Build.Framework;
19: using Microsoft.Build.Utilities;
20:
21:
22: public class ParamSample : Microsoft.Build.Utilities.Task {
23:
24: private bool _Success = true;
25:
26: public virtual bool Success {
27: get {
28: return _Success;
29: }
30: set {
31: _Success = value;
32: }
33: }
34:
35: private int _Iteration;
36:
37: public virtual int Iteration {
38: get {
39: return _Iteration;
40: }
41: set {
42: _Iteration = value;
43: }
44: }
45:
46: public override bool Execute() {
47:
48: for(int i = 0; i < Iteration; i++)
49: Log.LogMessage("i: " + i.ToString();
50:
51: return _Success;
52: }
53: }
54: }
En la misma, podemos ver:
- La definición de la propiedad Iteration entre las líneas 35 y 44
- La función Execute() que es la contiene el código de la Inline Task, entre las líneas 46 y 52
- La línea con el error –> 49
En este punto, ya podemos crear una Custom Task para MSBuild, probar este código, depurar, etc.
Saludos @ Here
El Bruno (@elbruno en Twitter)