Résoudre les problèmes de dépendance de Composer avec les mises à jour de Drupal
Une partie de l'effort de Drupal pour être plus en ligne avec la grande communauté PHP a été d'utiliser Composer pour gérer les dépendances PHP. L'idée est qu'au lieu d'avoir à livrer tout le code Drupal à votre système de contrôle de version, vous n'avez qu'à enregistrer le code spécifique à votre site (principalement le répertoire 'sites'), ainsi que vos fichiers composer.json et composer.lock, qui déclarent alors les dépendances PHP (y compris tous vos modules et thèmes contributeurs). Il vous suffit ensuite d'exécuter "composer install" pour installer toutes les dépendances en une seule fois.
La plupart du temps, le processus de mise à jour de composer se déroule sans problème. De temps en temps, vous rencontrerez des conflits - et vous obtiendrez peut-être une erreur comme celle-ci :
Your requirements could not be resolved to an installable set of packages.
« Vos exigences n'ont pas pu être résolues en un ensemble de paquets installables. »
Cette ligne sera suivie d'une longue liste de dépendances de paquets en conflit les unes avec les autres. Un paquet peut nécessiter une version différente d'un autre paquet, ou ne pas correspondre à ce que vous avez spécifié par des contraintes de version dans votre fichier composer.json. Cet état de conflit est parfois appelé "l'enfer des dépendances". Voici un exemple :
- drupal/core 8.4.x-dev requires symfony/class-loader ~3.2.8 -> satisfiable by symfony/class-loader[3.2.x-dev, v3.2.10, v3.2.11, v3.2.12, v3.2.13, v3.2.8, v3.2.9].
- Can only install one of: symfony/class-loader[3.2.x-dev, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.10, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.11, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.12, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.13, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.8, v2.8.28].
- Can only install one of: symfony/class-loader[v3.2.9, v2.8.28].
- Installation request for symfony/class-loader (locked at v2.8.28) -> satisfiable by symfony/class-loader[v2.8.28].
Installation failed, reverting ./composer.json to its original content.
« Ne peut installer qu'un seul des éléments suivants ...
L'installation a échoué, ramenant ./composer.json à son contenu original. »
Il peut y avoir de nombreux problèmes qui vous empêchent d'effectuer une mise à jour - je vais passer en revue les problèmes les plus courants ici.
Contrainte de plateforme pour la version de PHP
J'ai rencontré le problème du "dependency hell" très tôt dans l'histoire de Drupal 8, en mettant à jour le site web d'un client de la version 8.3.7 à la version 8.4. J'ai passé un peu de temps sur Drupal.org à rechercher le problème, et j'ai trouvé ce fil de discussion, qui donne quelques suggestions pour changer les dépendances de Composer afin de contourner ce problème. Après quelques heures, j'ai réussi à le faire fonctionner sur mon environnement de développement local (une machine virtuelle Vagrant basée sur PHP 7).
Pour ajouter une pierre à l'édifice, je me suis souvenu que le serveur web de production fonctionnait avec PHP 5.6. Le serveur ne pouvait pas être immédiatement mis à jour vers PHP 7 car d'autres sites fonctionnaient également sur le serveur et nécessitaient des tests de compatibilité avant la mise à jour de PHP. Cela signifiait que je ne pouvais pas avoir de dépendances PHP sur le site qui nécessitaient PHP 7 ou plus.
Après avoir discuté avec d'excellents membres du groupe Drupal Support sur Facebook, et consulté la documentation de Composer, j'ai trouvé un moyen de déclarer une contrainte pour la version de PHP, en ajoutant un paramètre de plateforme à la section config de composer.json :
"config" : {
"platform" : {
"php" : "5.6"
}
}
Cela résout le premier problème qui était de s'assurer que seuls les paquets compatibles avec PHP 5.6 étaient utilisés.
Utiliser les bons paquets pour Drupal core
Dans les premiers jours de Drupal 8, les sites étaient installés en utilisant le modèle drupal-composer/drupal-project
, qui à son tour utilisait drupal/core comme dépendance principale pour Drupal core. Cela a causé des problèmes lors de la mise à jour de core, où Drupal et ses dépendances n'utilisaient pas les versions de paquets vérifiées par les tests automatisés de drupal.org pour core.
À l'époque, la communauté a proposé une solution à ce problème : le paquet webflo/drupal-core-strict
. Cependant, il était fortement lié aux exigences de Drupal 8.4, et n'était pas maintenu au-delà de cette version.
Heureusement, les responsables de Drupal core ont créé un nouvel ensemble de méta-paquets, et un nouveau modèle de projet, afin de traiter ce problème à l'avenir.
Le nouveau modèle drupal/recommended-project est maintenant la manière recommandée de créer un projet Drupal en utilisant Composer. Il divise à son tour les exigences de base en 3 méta-paquets :
- drupal/core-composer-scaffold - un plugin Composer pour placer les fichiers scaffold (comme
index.php
,update.php
, ...) du projetdrupal/core
à l'endroit désiré dans la racine du site web. - drupal/core-project-message - un plugin Composer qui affiche un message configurable après la fin du processus d'installation de Composer.
- drupal/core-recommended - nécessite ce projet au lieu de drupal/core afin de garantir que toutes les dépendances de
drupal/core
seront incluses dans votre site Drupal exactement à la même version que celle qui a été testée avec la version de Drupal que vous utilisez actuellement.
Si le fichier composer.json de votre projet contient drupal/core dans ses dépendances, vous devrez le supprimer et le remplacer par ces nouveaux métapackages.
composer remove drupal/core
composer require drupal/core-recommended
composer require drupal/core-composer-scaffold
Le paquetage 'drupal/core-project-message' n'est pas strictement nécessaire, mais peut être utile si vous voulez qu'il imprime des messages lors de l'installation.
composer require drupal/core-project-message
Modification de l'exigence minimale de stabilité des paquets
Parfois, l'un des paquets dont vous avez besoin peut avoir une mise à jour compatible, mais seulement dans une branche de développement. Si dans votre fichier composer.json, la valeur de la configuration de stabilité minimale est "stable", vous n'obtiendrez que des versions stables. Vous pouvez changer cette valeur pour l'une des options suivantes (dans l'ordre de stabilité) : dev
, alpha
, beta
, RC
, et stable
.
J'espère que cela aidera tous ceux qui essaient d'effectuer des mises à jour de Drupal via Composer.