La gestion des dépendances
         dans un projet PHP
                Forum PHP 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 projet 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 plus de 10 ans




                                         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
35
Création d’un paquet assez simple




                                    36
package.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <package packagerversion="1.4.10" version="2.0"
    xmlns="http://pear.php.net/dtd/package-2.0"
 …
 >
   <name>PHPUnit</name>
   <channel>pear.phpunit.de</channel>
   <summary>The PHP Unit Testing framework.</summary>
   <description>The PHP Unit Testing framework.</description>
   <lead>
    <name>Sebastian Bergmann</name>
    <user>sb</user>
    <email>sebastian@phpunit.de</email>
    <active>yes</active>
   </lead>
   <date>2012-05-31</date>
   <version>
   <release>3.6.11</release>
    <api>3.6.0</api>
   </version>
   <stability>
    <release>stable</release>                                   37
Génération semi-automatique
PEAR_PackageFileManager2 peut générer le fichier
package.xml




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




                                          39
Composer
           40
Projet récent et très actif
Initié en avril 2011, environ 1 900 commits




                                              41
Composer, Packagist & Satis
Trois outils complémentaires




                               42
Composer
Un gestionnaire de paquets en ligne de commande




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




                                                 44
Simplicité d’utilisation
php composer.phar install




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




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




                            47
Simplicité de diffusion




                          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
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/" }
       }
   }
                                                             51
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/" }
       }
   }
                                                             52
Possibilité de lancer des actions après
l’installation des dépendances
Vidage de cache, création de fichiers, etc.




                                             53
Chargement automatique
Compatible PSR-0




                         54
Chargement automatique

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




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




                                             55
Chargement automatique

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




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




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




                                               57
Packagist
Un annuaire de paquets bien fourni




                                     58
59
Packagist
  Quelques chiffres

                                                                                      Paquets
                                                                                      Versions

4000                                                                                    3 863




3000
                                                                              2 375


2000                                                                  1 791
                                                              1 423                     1 472
                                                      1 154
                                                                              1 015
1000                                            860
                                          752                         701
          625                658
                                                              484
                                                      352
                                          140   207
           7                  48
      0
     09/2011 10/2011 11/2011 12/2011 01/2012 02/2012 03/2012 04/2012 05/2012
Source: http://packagist.org/statistics                                                          60
Une adoption croissante
De plus en plus de librairies en vue l’utilise




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




                                             62
Satis
Un Packagist léger pour vos paquets privés




                                             63
{
    "name": "Jean-Marc Fontaine packages",
    "homepage": "http://satis.jmfontaine.net/",
    "repositories": [
        { "type": "git", "url": "ssh://git.jmfontaine.net/srv/
git/repositories/aviso.git" },
        { "type": "git", "url": "ssh://git.jmfontaine.net/srv/
git/repositories/soko.git" },
        { "type": "git", "url": "ssh://git.jmfontaine.net/srv/
git/repositories/modele-application.git" },
    ],
    "require-all": true
}




                                                                 64
{
    "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.*",
        "jmfontaine/aviso": "0.1.0"
    },
    "autoload": {
        "psr-0": { "Soko": "src/" }
    }
}

                                                          65
Création d’un projet à partir d’un modèle
hébergé avec Satis
php composer.phar create-project jmfontaine/
modele-application mon-projet --repository-
url=http://satis.jmfontaine.net




                                               66
Version stable en vue
Alpha 3 disponible, beta en juin,version stable
pour la fin de l’été




                                                  67
Merci !




 ‣ Commentaires et slides : https://joind.in/6458
 ‣ Blog : http://www.industrialisation-php.com/
 ‣ Twitter : @jmfontaine / @indusphp
 ‣ Email : jean-marc.fontaine@alterway.fr



                                                    68
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/


                                                                       69

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

  • 1.
    La gestion desdépendances dans un projet PHP Forum PHP 2012 1
  • 2.
    Jean-Marc Fontaine Passionné deweb 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
  • 3.
    La gestion desdépendances dans un projet PHP 3
  • 4.
  • 5.
    Copie manuelle desdépendances Simple à mettre en œuvre 5
  • 6.
    Garantit la disponibilité Pasde risque de voir disparaître la dépendance 6
  • 7.
    Impact sur ledépôt de code Taille plus importante, sauvegardes plus longues 7
  • 8.
    Mises à jourparfois difficiles Subversion avant la version 1.7 complique la mise à jour 8
  • 9.
  • 10.
    Paquets du systèmed’exploitation 10
  • 11.
    Lié au systèmed’exploitation «deb» pour la famille Debian, «rpm» pour famille Red Hat 11
  • 12.
    Simple à utiliser Debian: apt-get install phpmyadmin Red Hat : yum install phpmyadmin 12
  • 13.
    Partagé par toutle système Une seule version installée à la fois 13
  • 14.
    Peu de paquetsPHP disponibles Seules les librairies les plus connues sont disponibles 14
  • 15.
    Versions souvent anciennes Comparaisonde 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
  • 16.
    Possibilité de créerses propres paquets Pas infaisable mais pas trivial 16
  • 17.
  • 18.
    svn:externals avec Subversion Simpleà mettre en œuvre mais réservé aux répertoires 18
  • 19.
  • 20.
    Sous-modules Git Un peuardu à mettre en œuvre 20
  • 21.
  • 22.
  • 23.
    Archives PHAR* * Attention: un jeu de mot hasardeux s’est glissé dans cette vignette. Sauras-tu le retrouver ? 23
  • 24.
    Simplicité d’emploi Copier l’archivesuffit à installer ou mettre à jour 24
  • 25.
    Simplicité de déploiement Unseul fichier à gérer. Possibilité de le compresser. 25
  • 26.
    Projet complet Impossible dene prendre qu’une partie d’un projet 26
  • 27.
    Peu de projetdistribués sous ce format atoum, Composer, Clinner, Goutte, Hoa, PHP Coding Standard Fixer, Symfttpd, etc. 27
  • 28.
    La configuration pardéfaut de PHP pose parfois des problèmes 28
  • 29.
  • 30.
    Eprouvé Le projet existedepuis plus de 10 ans 30
  • 31.
    Qualité inégale Malgré lesrègles pour assurer une qualité homogène, le bon côtoie le très (très) moyen 31
  • 32.
    Peu attractif Peu delibrairies majeures choisissent d’être disponibles dans PEAR 32
  • 33.
    Vieillissant De plus enplus de paquets ne sont plus maintenus 33
  • 34.
    Un installeur indépendantet bien vivant On peut diffuser ses librairies via un canal PEAR personnalisé 34
  • 35.
  • 36.
    Création d’un paquetassez simple 36
  • 37.
    package.xml <?xml version="1.0"encoding="UTF-8"?> <package packagerversion="1.4.10" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" … > <name>PHPUnit</name> <channel>pear.phpunit.de</channel> <summary>The PHP Unit Testing framework.</summary> <description>The PHP Unit Testing framework.</description> <lead> <name>Sebastian Bergmann</name> <user>sb</user> <email>sebastian@phpunit.de</email> <active>yes</active> </lead> <date>2012-05-31</date> <version> <release>3.6.11</release> <api>3.6.0</api> </version> <stability> <release>stable</release> 37
  • 38.
  • 39.
    Création d’un canalpersonnalisé facile avec Pirum 39
  • 40.
  • 41.
    Projet récent ettrès actif Initié en avril 2011, environ 1 900 commits 41
  • 42.
    Composer, Packagist &Satis Trois outils complémentaires 42
  • 43.
    Composer Un gestionnaire depaquets en ligne de commande 43
  • 44.
    Installation simple curl -shttp://getcomposer.org/installer | php 44
  • 45.
  • 46.
    Dépendances par projet Pasd’effet de bord 46
  • 47.
  • 48.
  • 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/" } } } 49
  • 50.
    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
  • 51.
    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/" } } } 51
  • 52.
    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/" } } } 52
  • 53.
    Possibilité de lancerdes actions après l’installation des dépendances Vidage de cache, création de fichiers, etc. 53
  • 54.
  • 55.
    Chargement automatique "autoload":{ "psr-0": { "VendorNamespace": "lib/" }, "classmap": ["src/", "classMap.php"] }, "include-path": ["src/", ""] require __DIR__ . '/vendor/autoload.php'; 55
  • 56.
    Chargement automatique "autoload":{ "psr-0": { "VendorNamespace": "lib/" }, "classmap": ["src/", "classMap.php"] }, "include-path": ["src/", ""] require __DIR__ . '/vendor/autoload.php'; 56
  • 57.
    Création d’un projetà partir d’un modèle php composer.phar create-project jmfontaine/ application mon-projet 57
  • 58.
    Packagist Un annuaire depaquets bien fourni 58
  • 59.
  • 60.
    Packagist Quelqueschiffres Paquets Versions 4000 3 863 3000 2 375 2000 1 791 1 423 1 472 1 154 1 015 1000 860 752 701 625 658 484 352 140 207 7 48 0 09/2011 10/2011 11/2011 12/2011 01/2012 02/2012 03/2012 04/2012 05/2012 Source: http://packagist.org/statistics 60
  • 61.
    Une adoption croissante Deplus en plus de librairies en vue l’utilise 61
  • 62.
    Des sources variées VCS(Subversion, Git, Mercurial), archives 62
  • 63.
    Satis Un Packagist légerpour vos paquets privés 63
  • 64.
    { "name": "Jean-Marc Fontaine packages", "homepage": "http://satis.jmfontaine.net/", "repositories": [ { "type": "git", "url": "ssh://git.jmfontaine.net/srv/ git/repositories/aviso.git" }, { "type": "git", "url": "ssh://git.jmfontaine.net/srv/ git/repositories/soko.git" }, { "type": "git", "url": "ssh://git.jmfontaine.net/srv/ git/repositories/modele-application.git" }, ], "require-all": true } 64
  • 65.
    { "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.*", "jmfontaine/aviso": "0.1.0" }, "autoload": { "psr-0": { "Soko": "src/" } } } 65
  • 66.
    Création d’un projetà partir d’un modèle hébergé avec Satis php composer.phar create-project jmfontaine/ modele-application mon-projet --repository- url=http://satis.jmfontaine.net 66
  • 67.
    Version stable envue Alpha 3 disponible, beta en juin,version stable pour la fin de l’été 67
  • 68.
    Merci ! ‣Commentaires et slides : https://joind.in/6458 ‣ Blog : http://www.industrialisation-php.com/ ‣ Twitter : @jmfontaine / @indusphp ‣ Email : jean-marc.fontaine@alterway.fr 68
  • 69.
    Crédits photographiques Les photoset 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/ 69