Después de las pruebas que fuí haciendo con NAnt, jugando con AjGenesis, encontré la forma de automatizar algunas tareas que me parece bueno compartir acá.

Quiero agradecer a Ángel «Java» López y a Claudio Meschini que en más de una ocasión me asistieron con sus generosos aportes, en el marco del Grupo Google CodeGeneration donde nos encontramos un grupo de profesionales con similares inquietudes. Este es un grupo abierto y están todos invitados a participar.

Para quien desconoce NAnt recomiendo la lectura de Introducción a NAnt.

Estos son algunos ejemplos de tareas que pueden ejecutarse dentro de un archivo .build.

  • Creación de un directorio virtual en Internet Information Server.

    <target name=»CreateVirtualDirectory»>
        <mkiisdir
            dirpath=»c:/inetpub/wwwroot/Prueba»
            vdirname=»Prueba»
            failonerror=»false»
        />
    </target>

Crea un directorio virtual de nombre Prueba en el directorio c:/inetpub/wwwroot/Prueba.

  • Armar un proyecto de tipo Class Library.

    <target name=»BuildCore»>
        <vbc target=»library» output=»C>/bin/Core.dll» rootnamespace=»Core» >
            <imports>
                <import namespace=»System» />
                <import namespace=»System.Data» />
                <import namespace=»System.Xml» />
                <import namespace=»Microsoft.Practices.EnterpriseLibrary.Common» />
                <import namespace=»Microsoft.Practices.EnterpriseLibrary.Data» />
            </imports>
            <references>
                <include name=»System.dll» />
                <include name=»System.Data.dll» />
                <include name=»System.Xml.dll» />
                <include name=»c:/Resources/Microsoft.Practices.EnterpriseLibrary.Common.dll» />
                <include name=»c:/Resources/Microsoft.Practices.EnterpriseLibrary.Data.dll» />
            </references>
            <sources>
                <include name=»c:/Repositories/Core/*.vb» />
            </sources>
            <resources prefix=»Core» dynamicprefix=»true»>
                <include name=»c:/Repositories/Core/*.resx» />
            </resources>
        </vbc>
    </target>

Crea un proyecto de tipo Class Library, crea referencias a System.dll, System.Data, System.Xml, Microsoft.Practices.EnterpriseLibrary.Common y Microsoft.Practices.EnterpriseLibrary.Data, en el caso de estas dos últimas, además indica que las busque en c:/Resources. Además incluye en el proyecto todos los archivos con extensiones .vb y .resx que encuentre en la carpeta c:/Repositories/Core.

  • Cambio de carpeta.

<cd dir=»Resources» />

Cambia la carpeta activa a la carpeta Resources, relativa a la carpeta activa actual.

  • Ejecutar conjuntos de tareas alternativas.

<choose>
    <when Carpeta=»c:/Repositories/Core»>
        …
    </when>
    <when Carpeta=»c:/Repositories/Core2″>
        …
    </when>
    <otherwise>
        <fail>Se produjo un error.</fail>
    </otherwise>
</choose>

Si existe la carpeta c:/Repositories/Core ejecuta un conjunto de tareas, análogamente para la carpeta c:/Repositories/Core2, si no existe ninguna se muestra un mensaje.

  • Registrar una dll.

<comregister file=»miDll.dll» />

  • Eliminar un directorio virtual de Internet Information Server.

<deliisdir vdirname=»WebClient» />

  • Leer de un archivo .ini.

<iniread property=»miVariable» filename=»Setup.ini» section=»Inicial» key=»Nombre» default=»Carlos»/>

Esta línea lee de un archivo llamado Setup.ini de la section Inicial, la key Nombre, si no la encuentra asume el valor Carlos y lo guarda en la variable miVariable. El archivo Setup.ini se ve de la siguiente manera:

[Inicial]
Nombre=Carlos

  • Escribir un valor en un archivo .ini.

<iniwrite filename=»Setup.ini» section=»Inicial» key=»Nombre» value=»Carlos»/>

Para el mismo archivo Setup.ini del caso anterior, en este ejemplo graba el valor Carlos en la key Nombre de la section Inicial.

Además se pueden ejecutar expresiones SQL, comandos svn, crear un setup Windows Installer, ejecutar comandos de Source Safe, validar archivos XML con XSD o XML Schemas, compilar programas hechos en Visual Basic 6 y mucho más.

Existen funciones para determinar cuantos archivos hay en una carpeta, definir si un archivo existe dentro de un conjunto de archivos, obtener una lista de archivos como un string delimitado, obtener el estado de un determinado servicio, su nombre, su friendly name y sigue la lista…

Si hacen un recorrido por los links que recomiendo en la nota Introducción a NAnt van a poder apreciar la magnitud de este proyecto que no deja de crecer.

A esta altura se les debe estar ocurriendo una pila de aplicaciones con NAnt, cada uno en su especialidad puede comenzar a automatizar tareas repetitivas con un grado de elasticidad alto.

Espero que se beneficien con esto y se animen a dejar un comentario. 🙂