Voici un problème que l'on rencontre souvent quand le nombre de projets grossit, grossit...

Au début, nous avons un projet.

On créé un fichier build.xml, que l'on versionne avec le code.

Ensuite, on crée un deuxième projet, en utilisant les mêmes pratiques que le premier (ce sont les mêmes développeurs ou les mêmes outils / pratiques de développpement).

Solution de facilité, on copie le fichier build.xml du premier projet dans le second et on le versionne (duplicata) dans le deuxième projet.

Ensuite on créé un 3ième, 4ième, ..., Nième projet (toujours en dupliquant le fichier build.xml).

Viens le jour ou nous mettons à jour nos pratiques / outillage de développement. On se rend alors compte qu'il faut une "cible" PHING de plus pour gérer le déploiement sur notre nouveau serveur de préprod. Et la : Damned ! Il faut modifier tous les fichiers build.xml de chacun de projets (qui au passage ont certainement évolué chacun dans leur coin...)

Comment faire pour mutualiser ce fameux fichier (build.xml) ?

Build.xml, c'est du XML non ? On aurait pu se dire, nous n'avons qu'à utiliser un mécanisme d'inclusion ou d'héritage (par exemple un extends="c:/common/build.xml"), oui, mais ce n'est pas possible (aujourd'hui) a priori.

Comment faire ?

Phing propose le paramètre en ligne de commande "-f" ou "-buildfile" permettant de spécifier un fichier build.xml alternatif. En effet, par défaut c'est celui du répertoire courant qui est utilisé si il existe (l'exécution de phing plante si il n'existe aucun fichier build.xml dans le répertoire courant)

L'idée est alors la suivante :

  1. créer un fichier build.xml "générique" que vous positionnez dans un répertoire précis de votre système (ex: c:\dev\phpcommon\phing\build.xml, ou /etc/phpcommon/phing/build.xml)
  2. créer un script myphing.bat ou myphing.sh qui contient le code suivant :
phing -f $PHPCOMMON_HOME/bin/build.xml $*
  1. ajouter la variable d'environnement PHPCOMMON_HOME avec la valeur c:/dev/phpcommon ou /etc/phpcommon dans la liste des variables d'environnement système
  2. ajouter le répertoire %PHPCOMMON_HOME%/bin dans le path de votre système (variable d'environnement)
  3. redémarrer votre système (ou la ligne de commande)
  4. créer le fichier c:/dev/phpcommon/phing/build.xml avec le contenu suivant :
<?xml version="1.0" encoding="UTF-8"?>

<project name="php" basedir="." default="build">

    <property name="common.dir"      value="${project.basedir}/../"  override="true"/>
    <property name="project.basedir" value="${application.startdir}" override="true"/>

     ...

</project>

Vous pouvez maintenant utiliser la ligne de commande :

$ myphing <target>

pour exécuter la cible <target> situé dans le fichier c:/dev/phpcommon/phing/build.xml, à partir de la racine de votre projet.

Vous n'avez plus forcément besoin d'un fichier build.xml local à votre projet, sauf si vous avez des cibles (targets) spécifiques à votre projet (ce que je vous déconseille si vous avez plusieurs projets, je pense qu'il vaut mieux rationnaliser vos cibles). Si vous décidez toutefois de garder un fichier build.xml local à votre projet, vous pourrez l'utiliser en appelant la ligne de commande habituelle :

$ phing <target>

Maintenant, il ne vous reste plus qu'à créer l'ensemble de vos cibles communes / génériques à tous vos projets. Je vous propose d'ailleurs les miennes dans ce billet.