Se hai letto fino a oggi questo blog probabilmente sai che mi occupo di consulenza SEO e web marketing.
Un aspetto di cui non parlo molto è il mio background di programmatore, che solo riflettendoci più a fondo mi sono accorto essere “una marcia in più” molto comoda per automatizzare operazioni ripetitive e di routine.
Quante volte ti sarà capitato di cercare in rete qualcosa per:
- ripulire delle cartelle dai file temporanei ?
- lavorare con “configurazioni” diversi di siti web dinamici e applicazioni web a seconda che lavori in locale o nel server di produzione ?
- dover fare backup al volo ?
- dover sostituire in meno di 1 minuto su tutti i file di una cartella e relative sottocartelle stringhe diverse con altre ?
Se hai pazienza di leggere questo post chilometrico scoprirai uno strumentino gratuito e open source che la community di Apache.org mette a tua disposizione per automatizzare al massimo la tua produttività (se devi lavorare con file, cartelle, ftp, siti e applicazioni web insomma).
Automatizzazione con Apache Ant
Lo strumento di cui ti voglio parlare è Apache Ant e lo trovi qua: http://ant.apache.org/.
Ant richiede Java quindi devi avere una Java Virtual Machine (JVM) installata sul tuo PC.
Personalmente ti consiglio di scaricare il JDK dal sito ufficiale di Oracle/Sun per sfruttare Ant al 100%.
Questo perché alcuni task di Ant richiedono espressamente il JDK e non basta la semplice JVM: insomma il JDK occupa un pò più spazio ma la fatica è ripagata.
Configurare JDK e Ant
Dopo aver scaricato Ant, non c’è installazione: basta estrarre il file compresso in una cartella ad es. c:\ant .
Devi configurare JDK e Ant affinché funzionino nel tou PC.
Se usi un sistema Windows:
- vai Pannello di controllo > Sistema > Impostazioni avanzate
- clicca su “Variabili d’ambiente”
Configurazione di JDK
- nell’area dedicata alle Variabili di sistema clicca “Nuova”;
- si apre una finestrina che chiede nome variabile e valore variabile;
- inserisci JAVA_HOME nel nome variabile;
- in valore scrivi il percorso dove hai installato il JDK (ad es. C:\Program Files\Java\jdk1.6.0_03).
- conferma tutto cliccando ok.
- tra le variabili di sistema cerca la variabile dal nome Path e selezionala facendo doppio click
- alla fine del valore della variabile aggiungi ;%JAVA_HOME%\bin; (anche il punto e virgola iniziale, non è un errore!).
Configurazione di Ant
Per configurare Ant i passaggi sono fondamentalmente identici a quelli della configurazione di JDK.
La variabile da aggiungere è ANT_HOME e stavolta il valore inserito deve puntare alla cartella dove hai installato Ant.
In questo caso devi aggiungere alla fine del valore di Path ;%ANT_HOME%\bin;
Cosa è Ant e come funziona
Inizialmente Ant era un tool a riga di comando molto usato in ambienti opensource e commerciali per gestire la parte del ciclo di vita del software (compilazione, test unitari, build delle release da distribuire) ma il tool è così versatile che con un pò di fantasia come vedrai si presta bene per tante altre cose.
Tutto quello che devi fare per usare Ant è descrivere in un file di progetto (build.xml) quali sono gli obiettivi (target) che vuoi Ant esegua al posto tuo.
So già cosa pensi… ma dai a cancellare dei file temporanei ci metto un attimo. Figuriamoci incasinarsi la vita con una roba così complessa.
Si, ti rispondo io. Questo ragionamento è giusto se lo fai una tantum e basta.
Ma se per caso cancelli anche solo 1 volta al giorno i file temporanei dalle tue cartelle alla fine del mese avrai perso davvero tempo che potevi destinare a risorse più importanti. Allora perché non investire 5 minuti del tuo tempo in qualcosa che una volta scritto funziona perfettamente a vita tutte le volte che vuoi ?
Vediamo il contenuto del file build.xml con un semplice task per rimuovere file di backup e thumbnails create da Windows:
<project basedir="."> <target name="clean"> <echo>Avvio la cancellazione dei file</echo> <delete> <fileset dir="." includes="**/*.bak" /> <fileset dir="." includes="**/*.old" /> <fileset dir="." includes="**/~*" /> <fileset dir="." includes="**/Thumbs.db" /> </delete> <echo>File cancellati.</echo> </target> </project>
Il file build.xml contiene un progetto <project> e un obiettivo <target>. Il comando <delete> fa il resto.
Metti il file build.xml nella cartella root del tuo progetto e sei pronto al lancio.
Prima del lancio “tarocchiamo” Windows
Ant si esegue da riga di comando cioè da una finestra di DOS per cui le possibilità sono 2.
O ogni volta clicchi su Start poi digiti CMD + Invio, poi cambi cartella con i comandi DOS (CD \nomecartella).
Oppure fai in modo che, in qualsiasi cartella tu sia, Windows 7 mostri nel menu contestuale (quello che si apre con li pulsante destro) un’apposita voce per aprire la finestra di DOS.
Queste sono le chiavi da aggiungere al registro di Windows per ottenere il nostro risultato:
HKEY_CLASSES_ROOT\Directory\shell\opennew
@=”Dos Prompt in that Directory”
HKEY_CLASSES_ROOT\Directory\shell\opennew\command
@=”cmd.exe /k cd %1″
Ora che hai aperta la finestra di DOS sulla root del tuo progetto basta scrivere ant clean per veder eseguire in pochi secondi il nostro primo target.
Vedamo altri utilizzi di questo piccolo gioello di software opensource.
Target per una copia selettiva
Immaginiamo di lavorare in un sito web complesso e di voler pubblicare con l’avanzamento dei lavori solo le modifiche che riguardano alcune cartelle e/o pagine web.
Prima di tutto scegliamo una cartella dove copiare solo i file che abbiamo modificato.
Subito sotto <project> aggiungiamo una proprietà (ad es. qui ho scelto una sottocartella del progetto dal nome ‘release’):
<property name="releaseFolder" value="release" />
e scriviamo il target
<target name="release" depends="clean">
<delete dir="${releaseFolder}/" />
<mkdir dir="${releaseFolder}/" />
<copy todir="${releaseFolder}/">
<fileset dir="./" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/ajax/">
<fileset dir="ajax" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/beans/">
<fileset dir="beans" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/config/">
<fileset dir="config" includes="**/*.xml" />
</copy>
<copy todir="${releaseFolder}/controllers/">
<fileset dir="controllers" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/images/">
<fileset dir="images" includes="**/*.png" />
<fileset dir="images" includes="**/*.jpg" />
</copy>
<copy todir="${releaseFolder}/js/">
<fileset dir="js" includes="**/*.js" />
</copy>
<copy todir="${releaseFolder}/logic">
<fileset dir="logic" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/models/">
<fileset dir="models" includes="**/*.php" />
</copy>
<copy todir="${releaseFolder}/templates">
<fileset dir="templates" includes="**/*.tpl" />
</copy>
<copy todir="${releaseFolder}/views">
<fileset dir="views" includes="**/*.php" />
</copy>
</target>
Come vedi ogni volta cancello (<delete>) e ricreo (<mkdir>) ex novo la cartella di release per essere sicuro che non ci siano residui di file con versioni precedenti, poi indico ad Ant quali tipi di file copiare <fileset> attraverso il comando <copy>.
Anche in questo caso basterà scrivere ant relase e vedere lavorare Ant al posto nostro.
Copia di backup al volo
Anche in questo caso aggiungiamo una proprietà specifica al progetto per indicare il nome del file che andremo a creare.
<property name="projectName" value="webapp001" />
Questo invece è il task di backup che prende il contenuto della cartella releaseFolder e lo comprime in un file .tar.gz pronto all’archiviazione!
<target name="backup">
<echo>Avvio il backup</echo>
<delete file="${releaseFolder}/${projectName}.tar.gz" />
<tar compression="gzip" longfile="gnu" destfile="${releaseFolder}/${projectName}.tar.gz">
<tarfileset dir="${releaseFolder}" prefix="prefix">
<include name="**"/>
<include name="wp-content/themes/gadget-story/header.php" />
<include name="wp-content/themes/gadget-story/footer.php" />
<exclude name=".cache/**" />
<exclude name="templates_c/**.**" />
<exclude name="wp-admin/" />
<exclude name="wp-includes/" />
<exclude name="wp-content/backup-0743b/" />
<exclude name="wp-content/plugins/" />
<exclude name="wp-content/themes/gadget-story/**.**" />
</tarfileset>
</tar>
<echo>Il backup è pronto!</echo>
</target>
Cambio nomi alle immagini e spostamento di cartella
Immagina di dover rinominare in maniera selettiva solo alcune immagini di una cartella.
In questo caso rimuovo dal nome del file “Immagine ” solo per le immagini di tipo jpg che contengono questo testo.
<target name="rename">
<property name="folder" value="immagini" />
<move todir="./${folder}/small">
<fileset dir="./${folder}/small">
<include name="**/*.jpg" />
</fileset>
<filtermapper>
<replacestring from="Immagine " to="" />
</filtermapper>
</move>
</target>
Cambio di configurazione
Il penultimo esempio della versatilità di Ant è sul cambio di configurazioni al volo.
La situazione tipo è questa: lavori su un server e un PC locali con settaggi di percorsi, database e password diversi rispetto a quelli effettivi del server di produzione.
Quante volte ti sarà successo di uploadare sul server remoto la configurazione locale e aver mandato in bomba l’applicazione web ?
Ant ti può aiutare anche in questo caso.
Ecco ad esempio di sostituzioni testuali di path in molti file:
<target name="customize" depends="release">
<echo>Adattamento percorsi</echo>
<replace dir="${releaseFolder}/" token="c:/siti/miosito.com/" value="/home/sito.com/public_html/">
<include name="**/*.xml" />
<include name="**/*.php" />
</replace>
<echo>Adattamento configurazione database</echo>
<replace file="${releaseFolder}/wp-config.php" token="development" value="production" />
<replace file="./${releaseFolder}/bootstrap.php" token="development" value="production" />
<echo>Aggiustamento path chiamate AJAX</echo>
<replace file="${releaseFolder}/templates/settoreMerceologicoAdd.tpl" token="http://localhost/sito.com" value="http://www.sito.com" />
<replace file="${releaseFolder}/templates/ricercaBestCase.tpl" token="http://localhost/sito.com" value="http://www.sito.com" />
<replace file="${releaseFolder}/templates/menu.tpl" token="http://localhost/site.com" value="http://www.sito.com" />
<replace file="${releaseFolder}/templates/ricercaBestCase.tpl" token="http://localhost/sito.com" value="http://www.sito.com" />
</target>
Perché dovresti usare Ant ?
Per almeno 3 motivi:
- Perché essendo scritto in Java è portabile tra più piattaforme Windows, Mac, Linux.
Una volta scritto il file di progetto build.xml questo funzionerà in qualsiasi sistema lavori. - Puoi scrivere task molto generici e riciclarli per ogni tuo progetto, spesso senza nessuno sforzo (basta un copia e incolla del file di progetto).
Ant permette la manipolazione del testo, dei file, ha task specifici per i comandi FTP. - Impari una cosa nuova “smanettando” a livello più basso rispetto alla solita attività di SEO o web marketing.
Dubbi o domande ?
Come al solito, scrivi qua sotto.
<echo>Cancellazione file in corso</echo>

{ 5 comments… read them below or add one }
Questa chicca non la conoscevo! …sapevo di avere ancora tanto da imparare!
Ciao Michele grazie per essere passato di qua.
Ma ti pare? Il piacere è tutto mio! Prima o poi dovremmo fare un discorsino, visto che ho da qualche tempo una idea che mi frulla in testa….. ma ti lascio con las curiosità, devo raffinare alcuni aspetti… ehehehe
Conoscevo ANT e l’ho usato spesso, normalmente in modo becero.
Mai per automatizzare task ripetitivi “fuori” dall’ambito “programming”.
Interessante e con molte applicazioni
Grazie!
Grazie a te per essere passato di qua Igor.
Personalmente per il programming puro in Java preferisco Maven.