I. Présentation▲
Phing est un outil inspiré d'apache Ant et destiné à PHP. Vous pouvez l'utiliser pour vous assister dans la réalisation de certaines tâches tout au long du 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...
- les avantages de Phing par rapport à un système de build construit à partir de scripts consoles ;
- l'installation de Phing et la mise en œuvre d'un script de build ;
- 2 exemples exécutables pour découvrir les services offerts par Phing ;
- les principaux outils supportés par Phing.
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és targets) réutilisables.
Le fichier build.xml est suffisamment verbeux pour être, lors de sa lecture, compréhensible sans connaissance préalable par un autre développeur .
II-B. Il fonctionne sur toutes les plateformes où PHP est disponible▲
Phing est codé en PHP. Vous pouvez donc l'utiliser dès lors que PHP est installé sur votre système.
Certaines fonctionnalités avancées peuvent ne pas fonctionner partout (par exemple, CHMOD).
II-C. Il supporte un grand nombre d'outils PHP▲
Il existe un grand nombre d'applications destinées à améliorer l'écriture du code PHP. Elles ont l'inconvénient de ne pas suivre les mêmes conventions ou la même logique. Phing intègre des tâches dédiées à certaines d'entre elles. Ces tâches sont normalisées et suivent une logique commune. Ce canevas est utile pour paramétrer, efficacement et avec un minimum d'effort, chacune d'entre elles sans sacrifier pour autant les possibilités de réglages avancés.
II-D. Il est documenté▲
La documentationDocumentation du projet Phing 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 dans la documentation officielle un chapitre entier détaillant les possibilités, proposant des gabarits pour travailler et expliquant pas-à-pas le processus de conception d'une nouvelle tâche.
II-F. Il facilite la mise en place d'un processus d'intégration continue▲
Il est utilisable avec la plupart des outils dédiés à l'intégration continue : Cruise controlTutoriel pour intégrer Cruise control avec Phing, Hudson, Xinc...
III. Comment installer Phing▲
Phing est disponible sous la forme d'un package PEAR. L'installation, la communication avec les applications tierces et la mise à jour de votre environnement est plus facile par ce moyen.
III-A. Installer Phing avec PEAR▲
Cet article ne couvre pas l'installation de PEAR. Si vous souhaitez vérifier sa présence sur votre ordinateur, rendez-vous sur le manuel de PEARManuel de PEAR.
Pour installer Phing, tapez dans une console la commande suivante :
pear channel-discover pear.phing.info
pear install phing/phing
Pour mettre à jour Phing, tapez la commande suivante :
pear upgrade phing/phing
III-B. Installer Phing sans utiliser PEAR▲
Cette méthode est déconseillée, car Phing faisant appel à des applications tierces fréquemment installées 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 le site de PhingPage Download de Phing et téléchargez la dernière version stable (la 2.4.0 à la date de rédaction de cet article).
- 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 ;
- ajoutez dans la variable d'environnement PATH le chemin complet PHING_HOME/bin ;
- créez la variable d'environnement PHING_HOME, sa valeur sera le chemin complet de PHING_HOME ;
- créez la variable d'environnement PHP_COMMAND, sa valeur sera le chemin complet du répertoire contenant l'exécutable php.exe ;
- créez la variable d'environnement PHP_CLASSPATH, sa valeur sera le chemin complet du répertoire PHING_HOME/classes ;
- si vous faites appel à d'autres outils à partir de Phing (PHPUnit...), vous devrez probablement ajouter leur chemin dans PHP_CLASSPATH (séparé par un ;).
À 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êt à lancer un build.
- helloworld.php : ce script affiche "Hello world" sur la sortie standard ;
- phpinfo.php : ce script affiche le phpinfo de votre environnement php, utile durant le développement ;
- build.xml : script XML de configuration de Phing.
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).
Les sources de cet exemple sont disponibles dans le package d'exemple
IV-A. Les fichiers PHP▲
Le code de ces fichiers est volontairement simple. L'objectif de cet article n'étant pas d'expliquer comment l'on écrit du PHP.
<?php
echo 'hello world'
;
?>
<?php
phpinfo();
?>
IV-B. Le fichier build.xml▲
Voici le fichier que vous allez exécuter. Par la suite, vous trouverez l'explication détaillée de chacun des éléments.
<?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-y simplement Phing.
Buildfile: D:\Programming\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.
<project
name
=
"SimpleHelloworld"
basedir
=
"."
default
=
"build"
>
- name : c'est le nom du projet. Cet argument n'influe pas sur l'exécution de script ;
- basedir : c'est le chemin du répertoire d'exécution du script ;
- default : c'est le nom de la target (cible) visée par défaut, si aucun argument n'est transmis à Phing au moment de l'exécution.
IV-E. Les tâches du script▲
Pour configurer vos tâches, vous les groupez dans une balise target. Ici, elle s'appelle build.
<target
name
=
"build"
>
Comme l'instruction echo, la tâche echo affiche un message sur la sortie standard.
<echo
msg
=
"Debut du build"
/>
Pour créer un dossier, vous utilisez la tâche mkdir. L'argument dir contient le chemin du dossier à créer. Si le dossier existe déjà, Phing passe à la tâche suivante.
<mkdir
dir
=
"./build"
/>
Pour copier un fichier, vous utilisez la tâche 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.
<copy
file
=
"helloworld.php"
tofile
=
"./build/release/helloworld.php /"
>
V. Les autres exemples▲
Les deux exemples supplémentaires, disponibles dans le package d'exemplesPackage d'exemples associé à cet article, 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.
Pour les utilisateurs de Windows, chacun des projets contient un fichier cmd.bat permettant d'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.
Qu'est-ce que c'est ?
----------------------
Vous pourrez grâce à cet exemple exécuter un script de build qui archive
automatiquement chacune de vos releases. Ce build est adapté aux petits
projets pour lesquels vous travaillez souvent seul et pour lesquels vous n'employez
pas de serveur de version.
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 dont le nom est basé sur 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 dont le nom est basé sur le numéro de version.
Pour changer le numéro de version, vous devez éditer la propriété projectVersion
dans 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.
Contrairement au build précédent, vous ne configurez pas la copie fichier par fichier
mais vous configurez la tâche de copy pour copier tous les fichiers respectant certaines
conventions. Si vous rajoutez un fichier ou plusieurs fichiers à votre application,
vous n'aurez pas à modifier votre script de build.
Quelles sont les fonctionnalités de Phing utilisées ?
--------------------------------------------------
Ce sont :
# AvailableTask : vérifier qu'un dossier ou un fichier est disponible ;
# CopyTask : copier un ou plusieurs dossiers / fichiers ;
# DeleteTask : supprimer un ou plusieurs dossiers / fichiers ;
# ExitTask (FailTask) : arrêter l'exécution d'un script ;
# Fileset : permet de définir un groupe de fichiers à partir de règles d'inclusion
et d'exclusion pour les instructions manipulant des fichiers (CopyTask, DeleteTask...) ;
# IfTask : prise de décision durant le build ;
# Mapper : permet d'effectuer certaines transformations sur le nom des fichiers
dans le cadre de certaines opérations (CopyTask, DeleteTask...) ;
# PropertyTask : utiliser des variables permettant de modifier
la configuration du build ;
# Target : utiliser des targets dépendant les unes des autres ;
# ZipTask : compresser dans un seul fichier à l'aide de l'algorithme Zip, un ou
plusieurs dossiers / fichiers ;
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.
Qu'est-ce que c'est ?
----------------------
Cet exemple présente un build plus complexe. Celui-ci exécute les tests unitaires
PHPUnit, vérife que le code respecte la convention de code du projet PEAR
grâce à 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
Pour ce type de projet, l'emploi d'un serveur de version serait très avantageux.
Cependant, nous allons volontairement l'omettre dans cet exemple pour des raisons
de facilité de mise en oeuvre.
Note : dans la pratique, si vous n'avez pas de serveur de version, vous
pouvez figer votre environnement dans une archive, en excluant le dossier contenant
tous les packages de release. Ainsi, vous pourrez en quelques clics revenir à une
version différente de votre développement. Vous pourrez également utiliser un outil
tel que winmerge pour comparer les deux versions de votre projet. Il ne s'agit toutefois que
d'un palliatif valable si vous travaillez seul, un serveur de version restant
recommandé car il rend beaucoup plus de services que le simple archivage.
Dans cet exemple, vous découvrirez une méthode pour sauvegarder dans un fichier
séparé le code commun à chacun de vos builds (procédé recommandé 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 déclenche deux
warnings) ;
# génération de la documentation d'API ;
# exécution de toutes les opérations 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.
Quelles sont les fonctionnalités de Phing utilisées ?
--------------------------------------------------
Ce sont :
# PhingTask : vous pouvez appeler une target dans un autre fichier de build
(ceci est utile pour mettre en commun le code de vos builds) ;
# PhpUnitTask : vous exécutez les tests unitaires grâce à cette tâche (mais ceci n'est
pas compatible avec les suites de tests ; Phing construit ses propres suites) ;
# PhpCodeSnifferTask : vous vérifiez avec cette tâche le style de votre code
grâce à PHP_CodeSniffer ;
# PhpDocumentorTask : vous pouvez générer la documentation de l'API de votre
code et le manuel utilisateur à partir de fichiers docbook grâce à 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 les outils tiers utilisables dans Phing. Ceux-ci sont souvent écrits en PHP. Le tableau suivant présente une liste non exhaustive des 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ées de vos projets. |
Exécuter une commande console | Non | Vous pouvez exécuter une commande Shell à partir de Phing. Cette fonctionnalité est intéressante lorsque l'outil que vous souhaitez appeler n'a pas de tâche associée. Utilisez des commandes aussi simples 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 rend illisibles vos scripts PHP et en assure la protection par licence. |
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éfinies (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éconseillé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 Subversion (en abrégé 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 tâche 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. |
Vous trouverez toutes les informations pour utiliser ces outils dans le manuel de PhingManuel de Phing.
VII. Pour conclure▲
J'espère qu'à présent, 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 RideKick et Ovh qui m'ont guidé tout au long de la rédaction de ce premier article.
Je tiens à féliciter Papy_77 et jacques_jean pour leur patience et leurs nombreuses suggestions lors de la relecture de cet article pour rendre votre lecture encore plus agréable.
Je profite aussi des remerciements pour saluer le travail remarquable de tous les contributeurs qui ont participé au développement de cet outil exceptionnel.
Si vous souhaitez enrichir cet article en parlant de votre expérience personnelle avec Phing ou d'autres systèmes de build ou si vous avez des remarques, venez participer à la discussion sur le forum. 10 commentaires
VIII. Liens pour aller plus loin▲
Vous découvrirez dans cette section des liens pour approfondir les sujets abordés dans cet article.
- Portail du projet PhingPortail du projet Phing
- Projet cruise control pour l'intégration continuePortail du projet Cruise Control pour l'intégration continue
- Les classes et librairies vraiment utiles pour les développeurs PHP par Saud Kahn (traduit par Joris Crozier) ;
- Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser ;
- Développement piloté par les tests avec PHPUnit par Julien Pauli ;
- PHPUnit avancé : patterns de tests par Julien Pauli ;
- Utilisation de PHP_Code_Sniffer par Lorna Mitchell (traduit par Joris Crozier) ;
- XML/XSL avec PHP et le mode XSLT par bob ;
- PHP 4 et 5 : l'extension ZIP par julp ;
- Exécution périodique d'un script PHPExécution périodique d'un script PHP par m@.