Composer & Packagist : gérer les dépendances

Jean-Marc Lecarpentier
GREYC — Université de Caen

Problématique

  • Faut-il tout programmer dans un projet ?
  • Risques :
    • Shaving the yak ou toujours améliorer et alléger son code
    • Sharpening the ax ou aiguiser ses outils pour son projet
  • Pourquoi ne pas utiliser des bibliothèques ou 3rd party libraries ?

Problèmes rencontrés

  • Comment installer facilement ?
  • Avoir un autoload des classes
  • Gestion des versions et mises à jour
  • Référencement des bibliothèques

Gestionnaire de...

  • Logiciel qui installe les programmes nécessaires
  • Soit globalement ⇒ package manager
    • Exemples : apt, npm, PEAR, etc
  • Soit par projet ⇒ dependency manager
    • Exemples : yarn, composer, gradle, etc

Gestionnaire de dépendances PHP

  • Composer
  • Installe les dépendances demandées dans le dossier vendor/ à la racine du projet
  • Dépendances et contraintes de versions dans le composer.json

Dépendances et versions

  • Exemple de composer.json :
    {
        "require": {
            "monolog/monolog": "1.0.*"
        }
    }
  • monolog/monolog : nom de la dépendance sous la forme vendorName/packageName
  • 1.0.* : contraintes de version (voir les détails dans la documentation)

Figer les versions

  • composer.lock enregistre les numéros de versions installées
  • Commande composer install
    • crée composer.lock lors de la 1ère exécution
    • utilise ensuite les versions de composer.lock pour installer les dépendances, même si des versions plus récentes existent
  • Important pour le travail à plusieurs ⇛ mettre le composer.lock dans le git ou SVN du projet

Mettre à jour les dépendances

  • Commande composer update monolog/monolog met à jour la dépendance données en respectant les contraintes de version de composer.json
  • Commande composer update met à jour toutes les dépendances, en respectant les contraintes de version de composer.json
  • Chaque bibliothèque ayant son propre composer.json, Composer doit vérifier l'arbre des dépendances (peut être long si beaucoup de dépendances installées)

Autoload

  • Composer crée le fichier vendor/autoload.php
  • Inclure ce fichier dans index.php pour avoir un autoload des classes des dépendances
  • Possibilité d'ajouter un autoload PSR-4 pour le projet, par exemple :
    {
        "autoload": {
            "psr-4": {"Jml\\": "src/"}
        }
    }
  • Toute classe du namespace Jml sera autochargée à partir du dossier src/

Où sont les bibliothèques ?

  • Packagist : dépôt de bibliothèques PHP
  • Composer utilise Packagist par défaut
  • Publier ses bibliothèques sur Packagist
  • Possibilité d'utiliser un VCS privé

En bref

  • Composer : outil de gestion de dépendances
  • Indispendable sur les projets utilisant des bibliothèques tierces
  • Installation rapide
  • Génération de l'autoload