Fuori programma
13-08-2006 16.07.41 GMT+01Sviluppare nuovi task per NAntContinuiamo a parlare di NAnt vedendo come si può estendere il set di task standard

Nel post in cui introducevo NAnt ho concluso promettendo che avrei spiegato come realizzarne le estensioni. Mantengo l'impegno avvalendomi di un piccolo progetto che ho realizzato per esigenze interne e che ho reso scaricabile (compilato più sorgenti sotto licenza GPL ) da questo link.

L'esempio in questione mette a disposizione una funzione che replica la struttura del progetto di una applicazione web .Net realizzata in C# e ne filtra i file che non sono necessari alla delivery (cartella obj, file .cs, etc...). Ci sono ovviamente altri modi per fare la delivery delle applicazioni web, compresi anche nell'ambiente Visual Studio, ma esigenze di automazione interna mi hanno fatto preferire una soluzione di questo tipo, basata su NAnt. Ovviamente, non mi aspetto che questo progetto possa essere utile a tanti utenti così come è distribuito, ma come esempio ritengo sia sufficientemente valido ed essendo anche molto semplice potrebbe benissimo costituire una base di partenza per altre realizzazioni.

Come vedremo, fare una libreria per NAnt è un'operazione quasi banale. Si parte innanzitutto da un progetto .Net in C# (ma potrebbe essere VB) di tipo class library (che avrà perciò come output una dll).
Creiamo il file .cs destinato a contenere la classe con le nostre funzioni e ci curiamo di includere le seguenti dichiarazioni (oltre a quelle richieste delle altre eventuali funzioni che utilizzeremo internamente) :

using System;
using NAnt.Core;
using NAnt.Core.Attributes;

Questa operazione implica l'aver specificato tra i reference del progetto la dll NAnt.Core.dll presente nella cartella "bin" dell'installazione di NAnt.
Dichiariamo poi il nostro namespace e la nostra classe pubblica. Riguardo a quest'ultima dobbiamo avere cura di far precedere la dichiarazione da un attributo specificato in questo modo :

[FunctionSet("WebDelivery", "Web Delivery")]

Qui figurano due parametri che sono, nell'ordine, il nome del namespace che dovremo anteporre alla chiamata della funzione che ci interessa ed il suo testo di descrizione.
Questo passaggio è molto importante perchè fa sì che NAnt "veda" la libreria come un set di sue estensioni.
La nostra classe non solo deve presentare questo attributo, ma deve anche discendere dalla classe FunctionSetBase della libreria NAnt.Core, mentre il costruttore, come in questo caso, normalmente resta vuoto chiamando esplicitamente quello del suo antenato.

[FunctionSet("WebDelivery", "Web Delivery")]
public class FileTree : FunctionSetBase
{
   public FileTree(Project project, PropertyDictionary properties) : base (project, properties)
   {
      // NOP
   }

    // funzioni da pubblicare
 
}

A questo punto, non resta che specificare le funzioni che ci servono e ricordarci di farlo usando la clausola static. Ogni funzione da pubblicare deve essere preceduta anch'essa da un attributo simile a quello della classe, ma con un solo parametro, ossia il nome con cui andrà chiamata :

[Function("CopyTreeFiltered")]
public static bool CopyTreeFiltered(string rootDir, string destDir)
{
   // corpo della funzione
}

Il lavoro è praticamente finito, non ci resta che compilare, installare l'estensione e provare il nostro task.
L'installazione consiste nel copiare la dll nella cartella

%NANT_HOME%\bin\tasks\net

Concludiamo ora con un esempio di target :

<target name="delivery" description="prepares a complete delivery folder into the root called 'otherbit_delivery' ">

   <delete if="${directory::exists('/otherbit_delivery/')}" dir="/otherbit_delivery/" verbose="true" />

   <mkdir dir="/otherbit_delivery/" />

   <echo message="Otherbit tree copied" if="${WebDelivery::CopyTreeFiltered(path::combine(directory::get-current-directory(), 'otherbit'), 'C:\otherbit_delivery')}" />

</target>

Le attività che esegue sono le seguenti :

  • cancella la precedente cartella di delivery con tutto il suo contenuto (se esiste);
  • ne crea una nuova;
  • esegue la copia filtrata del progetto usando la nostra funzione e stampa un messaggio se l'operazione ha successo.


data modifica 13-08-2006 22.00.37 GMT+01

#

Non ci sono commentiFeed RSS 2.0 di : Fuori programma, commenti a "Sviluppare nuovi task per NAnt"
Aggiungi un commento
Mittente : *
Email : 
Web : 
Testo del messaggio : * 
Codice di validazione : * 

otherbit, by Cosimo Carbonelli m. info@otherbit.com p.i. 11743080159
made with OtherWeb