Tareas de MSBuild

Las extensiones ofrecen una serie de tareas para MSBuild para trabajar con kbase de Genexus. Para poder utilizar las tareas hay que importar en el script del msbuild el archivo de definiciones "LsiExtensions.targets" que se incluye en la instalación de las extensiones. Las tareas declaradas se describen a continuación.

Si se tiene configurado que al generar se cree el directorio virtual en el IIS, la ejecución de esta tarea requiere permisos de administrador, ya que lanza la ejecución de appcmd.exe start apppool .... Si se crease una tarea programada para lanzar msbuild, por ejemplo, para hacer builds nocturnos, hay que acordarse de marcar "Ejecutar con los privilegios más elevados" en la tarea programada. Si no se hace, la tarea programada quedará colgada en el paso "Updating web config ..."

LsiLogSectionStart / LsiLogSectionEnd

Permiten registrar el log de Genexus de las tareas incluidas entre estas dos tareas. Este log puede mandarse por correo con la tarea LsiSendEmail.

Las otras tareas declaradas por las extensiones no debería incluirse dentro de estas tareas, ya que el log de dichas tareas siempre queda registrado, y siempre se envian en el correo.

Estas tareas pueden usarse varias veces dentro del archivo MsBuild, pero no recursivamente (secciones dentro de secciones).

    <LsiLogSectionStart SectionTitle="Build all" IsWeb="false"/>
      <BuildAll ForceRebuild="false" CompileMains="false" DetailedNavigation="false" />
      ...
    <LsiLogSectionEnd />
SectionTitle Titulo que se da en el correo al log de la ejecución de las tareas dentro de esta sección.
IsWeb Indica si las tareas que se ejecutan se refieren a generadores web o no.
Cuando se manda el log por correo, este se manda en formato HTML. Las tareas intentan parsear errores de compilación C#, y si encuentran alguno, ponen un link al archivo fuente con el error. Este flag se necesita para saber en que directorio está ubicado el archivo fuente con el error (si en la carpeta del modelo, o en la carpeta "web" del modelo).

Limitaciones

Estas tareas sólo registran el log de lo que sería la ventana "Output" de Genexus. Si se incluyen tareas propias de MsBuild (crear directorios, copiar archivos, etc.), el log de dichas tareas no quedará registrado.

LsiSendEmail

Envia por correo el log capturado por las tareas LsiLogSectionStart / LsiLogSectionEnd y el resto de tareas declaradas en estas extensiones.

	<LsiSendEmail FromEmail="xxx@xxx.com" ToEmails="@(DestinationEmails)"
              EmailHost="xxx" EmailUserName="xxx@xxx.com"
              EmailPassword="xxx" />
FromEmail Dirección de correo de origen para enviar el correo con el log del proceso. Si no se indica, no se enviará ningún correo.
ToEmails Un ItemGroup con las dirección de correo a las que enviar el correo con el log del proceso. Si no se indica ninguno, no se enviará ningún correo.
EmailHost Dirección del servidor de correo. Si no se indica, no se enviará ningún correo.
EmailUserName / EmailPassword Usuario y password con los que autenticarse en el servidor de correo.

Limitaciones

No hay soporte para configuración avanzada del envio del correo. El envio se hace con SMTP estandar: No se soporta SSL, ni cambiar el puerto de destino ni ningún otro tipo de configuración aparte de la descrita.

LsiCompileTask

Es una tarea para compilar todos los mains de uno o varios generadores de la kbase. En caso de compilar un main con generador c# win, y si la propiedad "Assemblies structure" del generador vale "By main", intenta reparar errores en su RSP. Puede encontrar más información sobre la reparación de RSPs en la documentación de la toolwindow Work with mains.

<LsiCompileTask Generator="$(Generator)" RepairRsp="all"/>
Generator Descripción del generador del que hay que compilar los mains, por ejemplo "Default (C#)". Si no se indica, se compilarán los mains de todos los generadores.
RepairRsp Sólo se aplica a generadores C# / Win, si la propiedad "Assemblies structure" del generador vale "By main". Indica si hay que intentar reparar o no los archivos RSP antes de la compilación. Puede valer una de estas opciones:
  • "default": Este es el valor por defecto si no se indica la propiedad. En este caso, si se ha indicado el flag "/debug" en la propiedad "Compiler flags" del generador, se intentarán agregar todos los archivos fuentes que falten. Si no se encuentra el flag sólo se intentarán agregar los fuentes referentes a Bussiness Components.
  • "all": Se intentan agregar todos los archivos fuente que falten.
  • "none": No se intentan reparar los archivos RSP.
  • "onlybc": Intenta agregar los fuentes referentes a Bussiness Components.

LsiBuildQuerys

Genera todos los objetos Query del entorno actual, sin especificar / generar nada.

<LsiBuildQuerys />

LsiDeleteBackups

Sólo tiene sentido si se suele usar la operación de compilación personalizada de la toolwindow Work with mains. Esta compilación puede generar archivos de backup en el directorio del modelo. Esta tarea borra dichos archivos.

<LsiDeleteBackups />

Ejemplo

Un ejemplo de archivo msbuild que usan las tarea sería el siguiente:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

	<!-- Import standard gx tasks and custom LSI tasks -->
	<Import Project="C:\Program Files (x86)\Artech\GeneXus\GeneXusXEv3\Genexus.Tasks.targets" />
	<Import Project="C:\Program Files (x86)\Artech\GeneXus\GeneXusXEv3\Packages\LsiExtensions.targets" />
  
  <PropertyGroup>
    
		<!-- Set the  kbase path -->
		<KBPath Condition=" '$(KBPath)' == '' ">D:\kbases\PruebasWinWebEv3</KBPath>
    
    <!--Set the model-->
    <KBEnvironment Condition=" '$(KBEnvironment)' == '' ">.Net Environment</KBEnvironment>
    
    <!--The generator to compile. If its empty, all generators will be compiled-->
    <!--<Generator>Default (C#)</Generator>-->
    
	</PropertyGroup>

  <!--Email addresses to send compilation reports-->
  <ItemGroup>
    <DestinationEmails Include="xxx@xxx.com" />
    <!--<DestinationEmails Include="yyy@xxx.com" />-->
  </ItemGroup>

  <!--Build kbase-->
  <Target Name="Build">
    
	<OpenKnowledgeBase Directory="$(KBPath)" />
    
    <SetActiveEnvironment EnvironmentName="$(KBEnvironment)" />
        
    <!--Start log section-->
    <LsiLogSectionStart SectionTitle="Build all" IsWeb="false"/>

      <!--Run a gx msbuild task-->
      <BuildAll ForceRebuild="false" CompileMains="false" DetailedNavigation="false" />
    
    <!--End log section-->
    <LsiLogSectionEnd />
    
    <!--Compile-->
    <LsiCompileTask Generator="$(Generator)" RepairRsp="all"/>

    <!--Generate query objects-->
    <LsiBuildQuerys />

    <!--Delete backup files-->
    <LsiDeleteBackups />

    <!--Send email-->
    <LsiSendEmail FromEmail="xxx@xxx.com" ToEmails="@(DestinationEmails)"
                  EmailHost="xxx" EmailUserName="xxx@xxx.com"
                  EmailPassword="xxx" />
    
	<CloseKnowledgeBase />
    
  </Target>

</Project>

El correo enviado tiene un formato parecido al siguiente:

Genexus build
KBase  D:\kbases\PruebasWinWeb
Enviroment  Prototipo
Build all
Building changed objects list
[Specification started]
Specifying WebPanel3 (1 of 1) ...
[Specification finished succesfully]
[Generation started]
Generating to CSharpModel\client.exe.config
Generating to CSharpModel\WCFClient.config
Generating to CSharpModel\gxmetadata\gxversion.json
Generating to CSharpModel\gxmetadata\gx_entity_list.json
Generating to sm18_2.ari
Generating to CSharpModel\runsets.ini
Generating to CSharpModel\bldAssemblies.cs
Generating to CSharpModel\GeneXus.Programs.Common.rsp
Generating to sm18_2.ari
[Generation finished succesfully]
[Generation started]
Generating to CSharpModel\web\gxcfg.js
Generating to CSharpModel\web\GXCFG.WEB
Generating to CSharpModel\web\client.exe.config
Generating to CSharpModel\web\WCFClient.config
Generating to CSharpModel\web\gxmetadata\gxversion.json
Generating to CSharpModel\web\gxmetadata\gx_entity_list.json
Generating to CSharpModel\web\bldDevelopermenu.cs
Generating to sm15_2.ari
Generating to CSharpModel\web\runsets.ini
Generating to CSharpModel\web\GeneXus.Programs.Common.rsp
Generating to sm15_2.ari
Generating to CSharpModel\web\exe.bld
Generating to CSharpModel\web\winexe.bld
Generating to CSharpModel\web\library.bld
Generating to CSharpModel\web\bld15.info
[Generation finished succesfully]
[WebPanel3 Compilation started]
gxexec "D:\kbases\PruebasWinWeb\CSharpModel\web\bldwebpanel3.cs" -r:GxBaseBuilder.dll -arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe"
[WebPanel3 Compilation finished succesfully]
[Web config update started]
Updating web config ...
[Web config update finished succesfully]

Default (C#) compilation
Checking RSP files...
Generating D:\kbases\PruebasWinWeb\CSharpModel\BldAssembliesCustom.cs file
"D:\kbases\PruebasWinWeb\CSharpModel\GXEXEC.EXE" "D:\kbases\PruebasWinWeb\CSharpModel\BldAssembliesCustom.cs" -r:GxBaseBuilder.dll -arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe" -arg:mdlpath="D:\kbases\PruebasWinWeb\CSharpModel"
Building bin\GeneXus.Programs.Common.dll
Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.7903
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.

Building bin\ProcedureMainConUnNo.dll
Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.7903
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.

Building bin\NotificationsRegistr.dll
Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.7903
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.

Building bin\Workpanel1.dll
Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.7903
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.

Building bin\WorkPanel2.dll
Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.7903
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.


Web (C#) compilation
[WebPanel1 Compilation started]
gxexec "D:\kbases\PruebasWinWeb\CSharpModel\web\bldwebpanel1.cs" -r:GxBaseBuilder.dll -arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe"
[WebPanel1 Compilation finished succesfully]
[WebPanel2 Compilation started]
gxexec "D:\kbases\PruebasWinWeb\CSharpModel\web\bldwebpanel2.cs" -r:GxBaseBuilder.dll -arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe"
[WebPanel2 Compilation finished succesfully]
[WebPanel3 Compilation started]
gxexec "D:\kbases\PruebasWinWeb\CSharpModel\web\bldwebpanel3.cs" -r:GxBaseBuilder.dll -arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe"
[WebPanel3 Compilation finished succesfully]
[Web config update started]
Updating web config ...
[Web config update finished succesfully]

Query objects
[SQL statement generation started]
Generating QryCliente ...
[SQL statement generation finished succesfully]

Remove backup files
D:\kbases\PruebasWinWeb\CSharpModel\Workpanel1-BACKUP-1.rsp deleted
D:\kbases\PruebasWinWeb\CSharpModel\Workpanel1-BACKUP.rsp deleted
2 files deleted