La gestion des dépendances
         dans un projet PHP
                   RMLL 2012




                     1
Jean-Marc Fontaine
Passionné de web depuis 1996, de PHP depuis 2000 et de
musique depuis 1977



  ‣ Consultant PHP chez Alter Way
  ‣ Ex-Président de l’AFUP
  ‣ Co-Auteur du livre blanc
    «Industrialisation PHP»
  ‣ Auteur du blog
    industrialisation-php.com

                                                         2
La gestion des dépendances
    dans un projet PHP



                             3
Gestion manuelle
                   4
Copie manuelle des dépendances
Simple à mettre en œuvre




                                 5
Garantit la disponibilité
Pas de risque de voir disparaître la dépendance




                                                  6
Impact sur le dépôt de code
Taille plus importante, sauvegardes plus longues




                                                   7
Mises à jour parfois difficiles
Subversion avant la version 1.7 complique la mise à
jour




                                                      8
9
Paquets du système d’exploitation
                                    10
Lié au système d’exploitation
«.deb» pour la famille Debian,
«.rpm» pour famille Red Hat




                                 11
Simple à utiliser
Debian : apt-get install phpmyadmin
Red Hat : yum install phpmyadmin




                                      12
Partagé par tout le système
Une seule version installée à la fois




                                        13
Peu de paquets PHP disponibles
Seules les librairies les plus connues sont disponibles




                                                          14
Versions souvent anciennes
Comparaison de versions


                          Officiel     Debian 6


    CakePHP               2.1.13    1.3.2 (10/11)


     Doctrine              2.2.2    1.2.2 (01/09)


   phpMyAdmin              3.5.1    3.3.7 (09/10)


     PHPUnit              3.6.11    3.4.14 (06/10)
                                                     15
Possibilité de créer ses propres paquets
Pas infaisable mais pas trivial




                                           16
Dépôt de code
                17
svn:externals avec Subversion
Simple à mettre en œuvre mais réservé aux
répertoires




                                            18
19
Sous-modules Git
Un peu ardu à mettre en œuvre




                                20
21
22
Archives PHAR*
* Attention : un jeu de mot hasardeux s’est glissé dans cette vignette. Sauras-tu le retrouver ?
                                                                                                   23
Simplicité d’emploi
Copier l’archive suffit à installer ou mettre à jour




                                                      24
Simplicité de déploiement
Un seul fichier à gérer. Possibilité de le compresser.




                                                        25
Projet complet
Impossible de ne prendre qu’une partie d’un projet




                                                     26
Peu de projets distribués sous ce format
atoum, Composer, Clinner, Goutte, Hoa, PHP
Coding Standard Fixer, Symfttpd, etc.




                                             27
La configuration par défaut de PHP pose
parfois des problèmes




                                         28
PEAR
       29
Eprouvé
Le projet existe depuis une douzaine d’années




                                                30
Qualité inégale
Malgré les règles pour assurer une qualité
homogène, le bon côtoie le très (très) moyen




                                               31
Peu attractif
Peu de librairies majeures choisissent d’être
disponibles dans PEAR




                                                32
Vieillissant
De plus en plus de paquets ne sont plus maintenus




                                                    33
Un installeur indépendant et bien vivant
On peut diffuser ses librairies via un canal PEAR
personnalisé




                                                    34
Création d’un paquet assez simple
Fichier XML de description, verbeux mais simple




                                                  35
Génération semi-automatique
PEAR_PackageFileManager2 peut générer le fichier
package.xml




                                                  36
Création d’un canal personnalisé facile
avec Pirum




                                          37
Composer
           38
Projet récent et très actif
Initié en avril 2011, plus de 2 000 commits




                                              39
Composer & Packagist
Deux outils complémentaires




                              40
Composer
Un gestionnaire de paquets en ligne de commande




                                                  41
Installation simple
curl -s http://getcomposer.org/installer | php




                                                 42
Simplicité d’utilisation
php composer.phar install




                            43
Dépendances par projet
Pas d’effet de bord




                         44
vendor/
    autoload.php
    composer/
    symfony/
        browser-kit/
        class-loader/
        css-selector/
        dom-crawler/
        event-dispatcher/
        finder/
        http-foundation/
        http-kernel/
        routing/
    twig/
        twig/




                            45
Simplicité de diffusion




                          46
composer.json
   {
       "name": "Soko",
       "description": "Light continuous integration tool",
       "license": "BSD-3-Clause",
       "authors": [
           {
               "name": "Jean-Marc Fontaine",
               "email": "jm@jmfontaine.net",
               "homepage": "http://jmfontaine.net/"
           }
       ],
       "require": {
           "php": ">=5.3.0",
           "symfony/console": "2.0.*",
           "symfony/finder": "2.0.*",
           "symfony/process": "2.0.*",
           "symfony/yaml": "2.0.*"
       },
       "autoload": {
           "psr-0": { "Soko": "src/" }
       }
   }
                                                             47
composer.json
   {
       "name": "Soko",
       "description": "Light continuous integration tool",
       "license": "BSD-3-Clause",
       "authors": [
           {
               "name": "Jean-Marc Fontaine",
               "email": "jm@jmfontaine.net",
               "homepage": "http://jmfontaine.net/"
           }
       ],
       "require": {
           "php": ">=5.3.0",
           "symfony/console": "2.0.*",
           "symfony/finder": "2.0.*",
           "symfony/process": "2.0.*",
           "symfony/yaml": "2.0.*"
       },
       "autoload": {
           "psr-0": { "Soko": "src/" }
       }
   }
                                                             48
composer.json
   {
       "name": "Soko",
       "description": "Light continuous integration tool",
       "license": "BSD-3-Clause",
       "authors": [
           {
               "name": "Jean-Marc Fontaine",
               "email": "jm@jmfontaine.net",
               "homepage": "http://jmfontaine.net/"
           }
       ],
       "require": {
           "php": ">=5.3.0",
           "symfony/console": "2.0.*",
           "symfony/finder": "2.0.*",
           "symfony/process": "2.0.*",
           "symfony/yaml": "2.0.*"
       },
       "autoload": {
           "psr-0": { "Soko": "src/" }
       }
   }
                                                             49
composer.json
   {
       "name": "Soko",
       "description": "Light continuous integration tool",
       "license": "BSD-3-Clause",
       "authors": [
           {
               "name": "Jean-Marc Fontaine",
               "email": "jm@jmfontaine.net",
               "homepage": "http://jmfontaine.net/"
           }
       ],
       "require": {
           "php": ">=5.3.0",
           "symfony/console": "2.0.*",
           "symfony/finder": "2.0.*",
           "symfony/process": "2.0.*",
           "symfony/yaml": "2.0.*"
       },
       "autoload": {
           "psr-0": { "Soko": "src/" }
       }
   }
                                                             50
Possibilité de lancer des actions après
l’installation des dépendances
Vidage de cache, création de fichiers, etc.




                                             51
Chargement automatique
Compatible PSR-0




                         52
Chargement automatique

 "autoload": {
     "psr-0": {
         "VendorNamespace": "lib/"
     },
     "classmap": ["src/", "classMap.php"]
 },
 "include-path": ["src/", ""]




 require __DIR__ . '/vendor/autoload.php';




                                             53
Chargement automatique

 "autoload": {
     "psr-0": {
         "VendorNamespace": "lib/"
     },
     "classmap": ["src/", "classMap.php"]
 },
 "include-path": ["src/", ""]




 require __DIR__ . '/vendor/autoload.php';




                                             54
Création d’un projet à partir d’un modèle
php composer.phar create-project jmfontaine/
application mon-projet




                                               55
Packagist
Un annuaire de paquets bien fourni




                                     56
57
Packagist
  Quelques chiffres

                                                                                                  Paquets
                                                                                                  Versions
                                                                                                    4 875
5000



3750                                                                                      3 345



2500                                                                              2 314

                                                                          1 791                     1 896
                                                                  1 442                   1 451
                                                          1 177
1250                                               868
                                                                                  1 006
                           664             758                             694
          626
                                                                   478
                                                           347
                                           139     204
           7                48
      0
      09/11             10/11             11/11   12/11   01/12   02/12   03/12   04/12   05/12    06/12
Source: http://packagist.org/statistics                                                                      58
Une adoption croissante
De plus en plus de librairies en vue l’utilise




                                                 59
Des sources variées
VCS (Subversion, Git, Mercurial), archives




                                             60
Version stable en vue
Alpha 4 disponible, version stable
pour la fin de l’été




                                     61
Merci !




 ‣ Slides : http://www.slideshare.net/JMF
 ‣ Blog : http://www.industrialisation-php.com/
 ‣ Twitter : @jmfontaine / @indusphp
 ‣ Email : jean-marc.fontaine@alterway.fr



                                                  62
Crédits photographiques
Les photos et illustrations suivantes ont été utilisées dans cette
présentation. Merci à leurs auteurs !


 ‣   https://secure.flickr.com/photos/cglosli/3296946161/

 ‣   http://www.vivelesrondes.com/oarystis/22836/

 ‣   https://secure.flickr.com/photos/library_of_congress/2163511028/

 ‣   https://secure.flickr.com/photos/halfbisqued/2353845688/

 ‣   https://secure.flickr.com/photos/advertisingelyse/3709966085/

 ‣   https://secure.flickr.com/photos/olibac/1823957148/

 ‣   https://secure.flickr.com/photos/reebob/3868826366/

 ‣   https://secure.flickr.com/photos/12287146@N04/4931171160/


                                                                       63

Gestion des dépendances dans un projet PHP - RMLL 2012