Les dépendances locales récursives dans un projet Composer

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Dans un précédent billet, j'ai parlé de comment il était possible de gérer les dépendances PHP dans un projet monorepo avec Composer. Si vous avez testé la méthode décrite, vous avez peut-être rencontré des difficultés lorsqu'une dépendance de votre projet a elle-même une dépendance dans le même dépôt.

Par exemple, si je développe un site e-commerce avec un composant Cart pour la gestion du panier et que je souhaite implémenter ce dernier dans une application Symfony. Je peux alors être tenté de créer un CartBundle qui sera intégré dans l'application principale.

On aurait l'arborescence ci-dessous :

applications/
    frontend/
        composer.json # Dépendance vers CartBundle
components/
    Cart/
        composer.json # Autonome
    CartBundle/
        composer.json # Dépendance vers Cart

Le fonctionnement de Composer dans ce cas est clairement expliqué dans la documentation: les repositories ne sont pas chargés récursivement. En effet, Composer estime que ce paramètre de configuration est exceptionnel et doit être utilisé de manière temporaire.

Pour pallier ce problème, vous devrez spécifier explicitement les sous dépendances dans la configuration votre application principale.

applications/
    frontend/
        composer.json # Dépendance vers CartBundle et explicite vers Cart
components/
    Cart/
        composer.json # Autonome
    CartBundle/
        composer.json # Dépendance vers Cart

Heureusement, pour éviter d'avoir à spécifier tous les répertoires contenant nos dépendances, Composer autorise l'utlisation de "wildcard" tel que * et ?. Ainsi le fichier composer.json de notre application pourrait ressembler à :

{
  "repositories": [
    {
      "type": "path",
      "url": "../../components/*"
    }
  ],
  "require": {
      "myapp/Cart": "*",
      "myapp/CartBundle": "*"
  }
}