Mettre à jour vers Drupal 9 à l'aide de Lenient

À ce jour il reste un peu plus de 3000 modules qui n'ont pas encore été mis à jour de Drupal 8 vers Drupal 9. Découvrez dans cet article comment contourner ce problème pour monter la version de votre site.

Comme nous l'indiquions dans un précédent article, Drupal 8 cessera d'être supporté le 2 novembre 2021 soit, à l'heure où cet article est écrit, dans moins d'un mois. Or, même si les mises à jour majeures ont été largement simplifiées depuis la sortie de Drupal 8, le fait d'avoir plusieurs modules en retard peut être complexe à gérer pour passer à cette nouvelle version majeure. En effet, chaque module (ou thème) déclare la ou les versions avec lesquelles il est compatible et si la personne qui le maintient n'est plus très réactive cela peut retarder votre propre montée de version.

Fonctionnement concret du système de gestion des dépendances

Concrètement, à partir du fichier info.yml des modules, le serveur packagist de Drupal va générer un arbre de dépendances. Lorsque votre composer va réclamer une mise à jour, cet arbre de dépendances sera analysé pour vérifier que tous vos paquets (core, modules, thèmes, etc.) sont compatibles entre eux. Un module qui ne déclarera donc pas officiellement supporter Drupal 9 ne sera pas reconnu comme compatible avec une montée de version du cœur et bloquera donc la procédure.

La mise à jour de Drupal 8 vers Drupal 9 étant principalement liée au remplacement de code déprécié et à la déclaration effective du support de la nouvelle version, la communauté a mis en place il y a plusieurs mois un robot qui est passé sur tous les modules ayant une version compatible avec Drupal 8 pour y indiquer les problématiques à traiter et proposer un patch lorsque c'était possible. Cependant, tant que ce patch n'est pas intégré par les personnes en charge de la maintenance des modules, le système de gestion des dépendances ne peut pas mettre à jour son arbre. En effet, même si vous appliquez le patch localement, cela intervient après le calcul des dépendances et ne permet donc pas de contourner le problème.

Initiative d'accélération des mises à jour

Face à l'approche de la fin de vie de Drupal 8, la communauté propose deux pistes pour aider la transition à se faire.

Ouverture à l'adoption des modules

Tous les modules et thèmes ayant une version de Drupal 8 mais pas de Drupal 9 ont été ouverts à l'adoption. Au terme d'une période de deux semaines durant laquelle les personnes en charge de la maintenance peuvent choisir de refuser de céder leur place (et potentiellement faire le nécessaire pour corriger le problème de compatibilité), il est possible pour quiconque dans la communauté de demander à se faire transférer la charge pour prendre la suite et rendre le module ou le thème compatible.

Création du point d'entrée composer Lenient

Auparavant, la méthode recommandée pour contourner le problème de gestion des dépendances de composer était de déclarer manuellement, pour chaque module ou thème impliqué, un repository personnalisé pour aller récupérer le code directement via git au lieu de passer par le packagist de Drupal. C'était un processus fonctionnel mais très fastidieux. La communauté, à l'écoute de tous les gestionnaires de sites en détresse, a donc mis en place un nouveau service appelé Lenient. C'est un nouveau dépôt packagist qui ne contient que les modules n'ayant pas encore de compatibilité Drupal 9 et qui ne déclare pas de dépendance sur le cœur de Drupal. Il vous permet ainsi de monter votre version du cœur sans blocage et d'appliquer ensuite les patchs qui permettront au module de fonctionner effectivement. Dès que le module aura été repris en main et que sa compatibilité aura été officialisée, il sera automatiquement retiré de Lenient et repassera pas le système original.

Utiliser Lenient pour votre mise à jour

Pour exploiter le potentiel de ce nouveau point d'entrée, vous devez utiliser composer 2 et mettre à jour votre composer.json en y ajoutant le nouveau repository avant le gestionnaire habituel de drupal.org.

Par exemple, si votre composer.json ressemble à ça (si vous vous demandez ce qu'est ce repository "assets" je vous invite à lire notre article sur la gestion des librairies front via composer) :

    "repositories": {
        "assets": {
            "type": "composer",
            "url": "https://asset-packagist.org"
        },
        "drupal": {
            "type": "composer",
            "url": "https://packages.drupal.org/8"
        }
    }

Il faut le transformer pour qu'il ressemble à ça :

    "repositories": {
        "assets": {
            "type": "composer",
            "url": "https://asset-packagist.org"
        },
        "lenient": {
            "type": "composer",
            "url": "https://packages.drupal.org/lenient"
        },
        "drupal": {
            "type": "composer",
            "url": "https://packages.drupal.org/8"
        }
    }

Ce nouveau repository prendra la priorité sur l'ancien pour tous les modules et thèmes n'étant pas encore officiellement portés et retirera leur dépendance au cœur (et uniquement au cœur) pour débloquer votre processus de mise à jour via composer. Cependant, pour que votre dépendance puisse être utilisée dans Drupal il est nécessaire que les changements soient appliqués au code. Bien heureusement il est aussi possible de le faire via composer et ce relativement facilement ! Je vous invite à consulter cet article d'un de nos confrères de la communauté Drupal française qui vous expliquera comment utiliser composer pour appliquer un ou plusieurs patchs sur vos dépendances.

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.

À propos de Edouard

Expert technique

Après un premier contact douloureux avec Drupal en 2009 en autodidacte, j'ai suivi une formation qui m'a convaincu de mon choix technologique et m'a vraiment mis en selle. Durant plusieurs années suite à cela j'ai accompagné des entreprises locales dans le développement de leurs projets de toutes sortes, de la simple vitrine à l'intranet social en passant par le projet e-commerce.