Composer, le cercle vertueux des dépendances

AFUP Lyon /

Qui suis-je ?
Consultant indépendant

Développements spécifiques, création de site, constitution d'équipes, accompagnement, méthodes agiles...

  https://chstudio.fr

  s.hulard@chstudio.fr

  @s_hulard

  http://github.com/shulard

Les 10 prochaines minutes...

  1. Composer ?
  2. L'option --prefer-lowest
  3. Cas réel avec HttpPlug


Composer ?

Qu'est-ce que c'est ?

Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
getcomposer.org

La gestion de dépendances

  • Déclarer les librairies utilisées dans votre projet
  • Trouver et installer les versions compatibles par rapport à l'environnement
							
  {
    "name": "symfony/framework-standard-edition",
    "require": {
      "php": ">=5.3.9",
      "symfony/console": "2.8.*",
      "symfony/yaml": "2.8.*"
    },
    "require-dev": {
      "phpunit/phpunit": "5.0"
    }
  }
							
						

Assurer la compatibilité

  • Différents environnements, différentes contraintes :
    • Versions de PHP
    • Extensions (xml, json, regex...)
  • Semantic Versioning
    • Versions patch, mineure, majeure
    • Cassures de compatibilités (BC break)
    • Garantie de fonctionnement de l'API publique

L'option `--prefer-lowest`

Qu'est-ce que c'est ?

Prefer lowest versions of dependencies.
Useful for testing minimal versions of requirements, generally used with --prefer-stable.
getcomposer.org

Pour l'histoire :
Introduit par Nicolas Grekas le CTO de Blackfire.io pour aider à fiabiliser les tests sur Symfony.

Pourquoi ?

  • Tester la compatibilité du code avec la version la plus ancienne
  • Garantir que le contexte d'exécution est stable

Comment ?

  • Créer des conditions de test spécifiques
    •  Penser à la version de PHP

Exemple avec un build Travis CI:

							
  matrix:
      include:
          - php: 5.4
            env: COMPOSER_FLAGS="--prefer-stable --prefer-lowest"

  install:
      - travis_retry composer update ${COMPOSER_FLAGS} --no-interaction

  script:
      - composer test
							
						

Quand ?

  • Fiabiliser la diffusion d'une librairie
  • Grande variété de contexte d'utilisation
  • S'assurer que le composer.json ne ment pas

Cas réel avec HttpPlug
https://github.com/php-http/react-adapter

Création d'un adapter

  1. Ajout de la dépendance:
    • react/http-client: 0.4.*
  2. Développement de l'adapter

\o/

Sauf que...

En testant avec --prefer-lowest :

							
  PHP Fatal error:  Class 'React\Dns\Resolver\Factory' not found in
  /home/travis/build/php-http/react-adapter/src/ReactFactory.php on line 37
							
						
  • Le projet React ne respecte pas les règles de Semantic Versionning, l'API publique a changé sur des versions PATCH.
  • Mon fichier composer.json ment...

Problème / Solution

  • Personne ne doit pouvoir importer l'adapter sur une version de React incompatible.
  • Il faut adapter les dépendances en conséquence.
							
  {
    "name": "php-http/react-adapter",
    "require": {
      "php": ">=5.4",
      ...
      "react/http-client": "^0.4.8",
      "react/dns": "^0.4.1",
      "react/stream": "^0.4.3"
    }
  }
							
						

Questions ?

http://shulard.github.io/talks/afup-lyon-lighting-mars-2016