Developpez.com - PHP
X

Choisissez d'abord la catégorieensuite la rubrique :


Gérer le cycle de vie d'une application PHP avec Phing

Date de publication : 20 february 2010

Par Fabien Arcellier
 

Vous venez de livrer votre produit, un problème apparait. vous êtes fatigué, un seul fichier PHP semble incriminé. Vous le corrigez. Vous décidez de passer outre votre procédure de livraison. Vous transférer directement le script PHP "corrigé" sur le serveur de production et là, c'est le drame ...
 
C'est une situation où aveuglé par la fatigue, l'on s'en veut de s'être comporté comme le pire des débutants. Phing est la solution pour éviter qu'un tel problème ne se reproduise.
 
Découvrez comment maîtriser le cycle de vie de votre projet PHP.

               Version PDF (Miroir)   Version hors-ligne (Miroir)

I. Présentation
II. Les avantages de Phing :
II-A. Il centralise les informations de build dans un seul fichier
II-B. Il fonctionne sur toutes les plateformes où PHP est disponible
II-C. Il supporte un grand nombre d'outils PHP
II-D. Il est documenté
II-E. Il est extensible
II-F. Il s'intègre dans un processus d'intégration continue
III. Comment installer Phing ?
III-A. Installer Phing avec PEAR
III-B. Installer Phing sans utiliser PEAR
IV. Ecrivez votre premier script build.xml pour Phing
IV-A. Les fichiers PHP
IV-B. Le fichier build.xml
IV-C. Exécutez l'opération de build
IV-D. L'entête du build
IV-E. Les tâches du script
V. Les autres exemples
V.1. 02-helloworld-package-release-by-version-in-zip :
V.2. 03-helloworld-unittest-codesniffer-phpdocumentor
VI. Survol des outils utilisables avec Phing
VII. Pour conclure
VIII. Liens pour aller plus loin


I. Présentation

Phing est un outil inspiré d'apache Ant destiné à PHP. Vous pouvez l'utiliser pour prendre en charge certaines étapes du le cycle de vie de vos projets tels que la génération de code, la construction des releases, la génération de la documentation, la génération de rapports (tests unitaires, couverture du code, aspect du code, ...), le déploiement dans différents environnements, ...

Vous découvrirez, au travers de ce document :

II. Les avantages de Phing :

Phing a de nombreux avantages comparé à un système de build plus archaïque construit à partir d'un ensemble de scripts de déploiement (fichiers PHP, Shell ou batch),


II-A. Il centralise les informations de build dans un seul fichier

Toutes les informations dont Phing a besoin pour fonctionner sont rassemblées dans le fichier build.xml. Vous y décrivez toutes les tâches que vous souhaitez réaliser. Vous pouvez construire des groupes de tâches (appelé target) réutilisables.

le fichier build.xml est suffisament verbeux pour être compréhensible par un autre développeur lors sa lecture sans connaissance préalable.


II-B. Il fonctionne sur toutes les plateformes où PHP est disponible

Phing est codé en PHP. Vous pouvez donc l'utiliser à partir du moment où PHP est installé sur votre système.

warning Certaines fonctionnalitées avancées peuvent ne pas fonctionner partout (par exemple, CHMOD).

II-C. Il supporte un grand nombre d'outils PHP

L'écosystème d'applications destinées à améliorer l'écriture du code PHP est très riche. Ces applications ont l'inconvénient de ne pas suivre les mêmes conventions ou la même logique. Phing intègre un grand nombre de tâches dédiés à des applications PHP. PEAR permet d'installer ces applications qui seront directement disponible dans Phing. Chacun de ces outils se configure de façon similaire. Ce canevas est utile pour paramétrer efficacement chacune d'entre elles avec un minimum d'effort sans sacrifier pour autant les réglages avancés.


II-D. Il est documenté

en La documentation est d'excellente qualité et détaille avec précision le rôle et la configuration de chaque tâche. Que celle ci fasse partie du noyau de Phing ou soit rattachée à un outil externe, vous trouverez fréquemment des exemples clairs et concis. Malheureusement, elle n'est pour le moment disponible qu'en anglais.


II-E. Il est extensible

Vous pouvez étendre Phing pour y ajouter de nouvelles tâches. Ainsi vous pourrez utiliser vos propres outils irremplaçables ou non implémentés. Le système d'extension est documenté. Vous trouverez un chapitre entier dans la documentation officielle détaillant les possibilités, proposant des templates pour travailler et expliquant pas à pas le processus de conception d'une nouvelle tâche.


II-F. Il s'intègre dans un processus d'intégration continue

Phing facilite la mise en place d'un processus d'intégration continue. Il est utilisable avec la plupart des outils : en Cruise control, Hudson, Xinc ...


III. Comment installer Phing ?

Phing est disponible sous la forme d'un package PEAR. L'installation , la communication avec les applications tiers et la mise à jour de votre environnement est plus facile par ce moyen.


III-A. Installer Phing avec PEAR

info Cet article ne couvre pas l'installation de PEAR. Si vous souhaitez vérifier sa présence sur votre ordinateur, rendez vous sur en le manuel de PEAR.
Pour installer Phing, tapez la commande suivante dans une console :
Installer Phing avec PEAR
pear channel-discover pear.phing.info
pear install phing/phing
Pour mettre à jour Phing, tapez la commande suivante :
Mettre à jour Phing avec PEAR
pear upgrade phing/phing

III-B. Installer Phing sans utiliser PEAR

warning Vous devriez éviter cette méthode. Phing fait appel à des applications tiers fréquemment installés grâce à PEAR, par exemple, PHPunit ou PHPdocumentor. L'installation de votre environnement de travail peut s'avérer délicate et souffrir d'un manque de cohésion.
Pour commencer, rendez vous sur en le site de Phing et télécharger la dernière version stable (la 2.4.0 à la date de cet article).

Etapes à suivre pour installer Phing sans PEAR
  1. Décompressez la distribution dans un dossier. Par la suite, nous ferons référence au chemin d'accès de ce dossier en temps que PHING_HOME,
  2. Ajoutez dans la variable d'environnement PATH le chemin complet PHING_HOME/bin,
  3. Assignez à la variable d'environnement PHING_HOME, le chemin complet de PHING_HOME,
  4. Assignez à la variable d'environnement PHP_COMMAND, le chemin complet du répertoire contenant l'exécutable php.exe,
  5. Assignez à la variable d'environnement PHP_CLASSPATH, le chemin complet du répertoire PHING_HOME/classes,
  6. Si vous faites appel à d'autres outils à partir de Phing (PHPUnit, ...), vous devrez probablement ajouter leur chemin dans PHP_CLASSPATH (séparé par un ;).
info A la place de PHP_CLASSPATH, vous pouvez ajouter le chemin complet du répertoire PHING_HOME/classes à la variable PHP include_path.

IV. Ecrivez votre premier script build.xml pour Phing

Maintenant que Phing est installé, vous êtes prêts à lancer un build.

Ce premier projet est composé de 3 fichiers:
Votre premier fichier de build copiera le script helloworld.php dans un sous dossier build/release (qu'il créera si celui ci n'existe pas).

info Les sources de cet exemple sont disponibles dans le srcs package d'exemple

IV-A. Les fichiers PHP

Le code de ces fichiers est simple. L'objectif de cet article n'est pas d'écrire du PHP.
helloword.php
<?php
echo 'hello world';	
?>
phpinfo.php
<?php	
phpinfo();
?>

IV-B. Le fichier build.xml

Voici le fichier que vous allez exécuter. Vous trouverez l' explication détaillée de chacun des éléments par la suite.
build.xml
<?xml version="1.0" encoding="UTF-8"?>

<project name="SimpleHelloworld" basedir="." default="build">
    <target name="build">
        <echo msg="Debut du build" />
        
        <echo msg="Création du répertoire build" />
        <mkdir dir="./build" />
        
        <echo msg="Création du répertoire release" />
        <mkdir dir="./build/release" />
        
        <echo msg="Copie du fichier helloworld.php vers build/release/helloworld.php" />
        <copy file="helloworld.php" tofile="./build/release/helloworld.php /">
        <echo msg="Fin du build" />
    </target>
</project>

IV-C. Exécutez l'opération de build

Pour exécuter votre build, vous devez ouvrir une console dans le répertoire du projet. Tapez simplement Phing.
Vous devez obtenir une sortie sensiblement équivalente sur votre console
Buildfile: D:\Programings\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build.xml

SimpleHelloworld > build:

     [echo] Debut du build
     [echo] Creation du repertoire build
    [mkdir] Created dir: D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build
     [echo] Creation du repertoire release
    [mkdir] Created dir: D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build\rel
ease
     [echo] Copie du fichier helloworld.php vers build/release/helloworld.php
     [copy] Copying 1 file to D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\buil
d\release
     [echo] Fin du build

BUILD FINISHED

Total time: 0.4153 seconds
Vérifier que Le fichier helloworld.php a bien été copié dans le sous dossier build/release.


IV-D. L'entête du build

Build.xml commence toujours par la balise project.
Le noeud project
<project name="SimpleHelloworld" basedir="." default="build">
Les arguments de project :

IV-E. Les tâches du script

Pour configurer vos taches, vous les groupez dans une balise target. Ici, elle s'appelle build.
Le noeud target
<target name="build">
Comme l'instruction echo, la tache echo affiche un message sur la sortie standard.
La tache echo
<echo msg="Debut du build" />
Pour créer un dossier, vous utilisez la tache mkdir. L'argument dir contient le chemin du dossier à créer. Si le dossier existe déjà, Phing passe à la tache suivante.
la tache mkdir
<mkdir dir="./build" />
Pour copier un fichier, vous utilisez la tache copy. L'argument file contient le chemin du fichier dont vous souhaitez copier le contenu et l'argument tofile le chemin du fichier où vous souhaitez coller le contenu.
la tache copy
<copy file="helloworld.php" tofile="./build/release/helloworld.php /">

V. Les autres exemples

Les 2 exemples supplémentaires, disponible dans le srcs package d'exemples, vous donneront un meilleur aperçu du potentiel de Phing. Je ne les détaillerai pas. Je vous encourage à les exécuter et à ouvrir le fichier build.xml pour chacun d'eux.

idea Pour les utilisateurs de Windows, chacun des projets contient un fichier cmd.bat pour ouvrir une console dans le dossier courant.

V.1. 02-helloworld-package-release-by-version-in-zip

:
Cet exemple illustre l'utilisation de propriétés pour configurer le build et la compression au format ZIP.
README.dev.txt

Qu'est ce que c'est ?
----------------------

Cet exemple présente un build simple permettant
d'auto archiver chacune de ses releases. Ce build est adapté à
des petits projets où vous travaillez seul.

Le fichier build.xml propose les opérations suivantes
 # Déploiement de l'application dans l'environnement de debug
 # Déploiement de l'application dans l'environnement de release et création 
    d'un package avec le numéro de version (Si un package existe, il ne sera pas
    remplacé et le script affichera un message d'erreur)
 # Déploiement forcé de l'application dans l'environnement de release et
    création /remplacement d'un package avec le numéro de version
 
Pour changer le numéro de version, vous devez éditer le fichier build.xml.

Pour un simple helloworld, ce déploiement est trop lourd mais vous pouvez l'adapter
à la majorité de vos applications. Les prérequis sont peu nombreux. 

Quels sont les fonctionalités de Phing utilisés ?
--------------------------------------------------

Les fonctionnalités de Phing utilisées sont :
- AvailableTask : Vérifier qu'un dossier ou un fichier est disponible
- CopyTask : Copier un ou des dossiers / fichiers
- DeleteTask : Supprimer un ou des dossiers / fichiers
- ExitTask (FailTask) : Arrêter l'exécution d'un script
- Fileset : Balise xml pour définir les fichiers concernés par une tache
- IfTask : Prise de décision durant le build
- PropertyTask : Utiliser des variables permettant de modifier 
    la configuration du build
- Target : Utiliser des targets dépendantes les unes des autres
- ZipTask : Compresser un ou des dossiers / fichiers grâce à l'algorithme Zip 
    dans un seul fichier

V.2. 03-helloworld-unittest-codesniffer-phpdocumentor

Pour cet exemple, vous devrez installer PHPUnit, Php_CodeSniffer et PhpDocumentor dans votre environnement PHP. Vous y découvrirez comment utiliser la date pour packager une release.
README.dev.txt

Qu'est ce que c'est ?
----------------------

Cet exemple présente un build plus complexe exécutant les tests unitaires
PHPUnit, vérifiant que le code respecte la convention de code du projet PEAR 
grace à PHP_CodeSniffer et génère la documentation de l'API en utilisant PhpDoc.

Comme dans les projets précédents, nous allons sortir un package au format zip
incluant le numéro de version, la date de l'exécution et le statut des tests 
unitaires qui ont été exécutés.

Le nom du package se présentera de la façon suivante
NomDuProjet-Version-YYYY-MM-DD-hh-mm-ss-TestsResult

Sur ce type de projet, l'emploi d'un serveur de version serait un gros plus.
Pour cet exemple, nous allons volontairement l'omettre pour raisons de facilité de
mise en oeuvre.

Note : Dans la pratique, si vous n'avez pas de serveur de versionning, vous 
pouvez figer votre environnement dans une archive en excluant le dossier contenant
tous les packages de release. Ainsi, vous pourrez revenir à une version differente
de votre developpement en quelques clics. Vous pourrez egalement utiliser un outil
tel que winmerge pour comparer vos 2 versions de votre projet. Il ne s'agit que 
d'un paliatif valable si vous travaillez seul, un serveur de versionning reste
idéal et rends beaucoup plus de services que le simple archivage.

Dans cet exemple, vous découvrirez une méthode pour factoriser le code 
commun à chacun de vos builds dans un fichier séparé (Utile dans le cadre de l
industrialisation de vos projets)

Le fichier build.xml propose les opérations suivantes
 # Exécution des tests PHPUnit
 # Exécution des tests PHP_CodeSniffer (Le fichier app/function.php declenche 2
    warnings)
 # Génération de la documentation d'API
 # Exécution de toutes les operations de quality assurance (documentation, tests)
 # Déploiement de l'application dans l'environnement de debug
 # Déploiement de l'application dans l'environnement de release
 # Packaging de l'application au format ZIP
 
Quels sont les fonctionalités de Phing utilisés ?
--------------------------------------------------

# PhingTask : Vous pouvez appeller une target dans un autre fichier de build
    Utile pour factoriser le code de vos builds;
# PhpUnitTask : Vous exécutez les tests unitaires grace à cette tache. C'est 
    non compatible avec les suites de tests. Phing construit ces propres suites;
# PhpCodeSnifferTask : Vous vérifiez avec cette tache le style de votre code
    grace à PHP_CodeSniffer;
# PhpDocumentorTask :  Vous pouvez générer la documentation de l'API de votre
    code et la génération de documentation à base de docbook avec Phpdoc.

VI. Survol des outils utilisables avec Phing

Dans le chapitre précédent, vous avez découvert l'aspect fonctionnel . Ici vous allez découvrir la trousse à outil de Phing. Il facilite l'intégration de beaucoup de programmes PHP dédiés à l'analyse, à la maintenance et au déploiement de votre application dans la gestion de votre cycle de vie. Le tableau suivant présente la liste des principaux outils supportés par la version 2.4.0.

Type d'opération Application(s) externe(s) nécéssaire(s) Description
Couverture du code par les tests PHPUnit et Xdebug Pour utiliser cette fonction, PHPUnit et Xdebug sont nécessaires. Cet outil génère un rapport sur la couverture de votre code par les tests unitaires. Vous pouvez créer un rapport sur quelques fichiers, par module ou sur l'application complète.
DbDeploy Non Cet outil intégré à Phing facilite la migration et l'évolution des bases de donnée de vos projets.
Exécuter une commande console Non Vous pouvez exécuter une commande shell à partir de Phing. Cet fonctionnalité est intéressante lorsque l'outil que vous souhaitez appeler n'a pas de task associée. Gardez les commandes aussi simple que possible. Dans l'idéal, ne cassez pas le support multiplateforme. SVN est un très bon exemple où cette fonctionnalité est indispensable. N'oubliez pas de gérer les erreurs.
FtpDeploy Non Phing peut prendre en charge le déploiement de votre application sur différents serveurs en utilisant le protocole FTP.
Ioncube Encoder Ioncube Encoder Cet outil commercial obfusque et licencie vos scripts PHP.
JsLint JsLint Cet outil analyse le code JavaScript pour vérifier l'usage des bonnes pratiques de développement.
JsMin Non JsMin est une application externe embarquée dans Phing. Vous n'avez donc pas besoin de l'installer. Cet outil minimise la taille d'un fichier JavaScript.
Outils XML Non Phing peut valider un ou plusieurs scripts XML à l'aide d'un schéma XSD et transformer un fichier XML en utilisant une feuille de style XSL.
PEAR Packager Non Phing crée un fichier XML permettant de déployer votre application au moyen de PEAR (supporte la version 1 et la version 2 de PEAR)
Phar Packager PECL's Phar Cet outil crée un package Phar. Tous les fichiers PHP d'une application sont rassemblés en un seul fichier. Un package Phar est utilisable dans PHP depuis la version 5.3. Ces packages sont optimisés pour améliorer la vitesse d'exécution des scripts.
Php_CodeSniffer Php_CodeSniffer Cet outil effectue une analyse statique de vos scripts pour vérifier qu'ils respectent les conventions de code que vous avez défini (PEAR, Zend, vos propres conventions ...).
phpCpd phpCpd PHP Copy/Paste detector est un script simple qui recherche les lignes de code dupliquées dans vos fichiers PHP.
PhpDocumentor PhpDocumentor Cet outil génère la documentation de votre API à partir des commentaires phpdoc écrits dans vos scripts. Vous pouvez aussi compiler des tutoriels ou des articles à partir de documents docbook.
phpLint phpLint Cet outil est un analyseur statique de code. Il vérifie les erreurs les plus communes en PHP (par exemple, l'emploi de fonctions dépréciées ou l'utilisation des short tags).
PHPUnit PHPUnit Vous pouvez exécuter vos tests unitaires et générer un rapport résumant leur exécution.
Scp Non Scp est une fonction permettant de copier un fichier au travers du protocole SSH. Vous pouvez déployer intégralement une application en utilisant le protocole SSH à place du protocole FTP.
Svn VersionControl_SVN Phing supporte les opérations SVN checkout, commit, export et update. Vous pouvez interagir avec un serveur de version SVN. On regrettera l'absence de certaines commandes SVN (merge, import, ...). Vous pouvez exécuter svn en utilisant la tache ExecTask qui permet d'exécuter une commande dans le shell de l'OS.
Zend code analyzeur Zend Code Analyzeur Zend code analyzeur est livré avec Zend studio. C'est un analyseur de code statique qui repère les erreurs les plus courantes dans du code PHP.
Zip & Tar Archive_Tar (pour les fichiers tar seulement) Vous pouvez créer des archives compressées ou décompresser des archives existantes au format Tar ou Zip.
Outils utilisables avec Phing
info Vous trouverez toutes les informations pour utiliser ces outils dans en le manuel de Phing.

VII. Pour conclure

Vous avez une meilleure idée de l'aide que peut vous apporter cet outil. Sous son apparente simplicité, Phing est une application puissante qui recèle beaucoup d'options pour faciliter votre quotidien.

Je remercie toutes les personnes de l'équipe developpez.com pour leur aide et pour leur relecture, ainsi que l'ensemble des développeurs de Phing pour leur travail remarquable.

Si vous avez aimé certains passages cet article, si au contraire vous pensez que d'autres devraient être repris, je vous encourage à laisser un commentaire à la suite.


VIII. Liens pour aller plus loin

Vous découvrirez dans cette section des liens pour approfondir es sujets abordés dans cet article.

Sources de cet article
En découvrir plus
Les ressources connexes sur Developpez.com


               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Contacter le responsable de la rubrique PHP