Mettre à jour son projet Composer et envisager sereinement la montée de version à Drupal 9
5 janvier 2021
Ces dernières semaines, des failles « critiques » ont été découvertes dans le core de Drupal (on en profite pour remercier l’équipe de sécurité Drupal qui s’occupe du suivi des bogues et met à disposition des mises à jour rapidement). Personnellement, j’ai dû mettre à jour deux sites qui n’ont pas eu l’occasion d’avoir un suivi régulier. J’ai trouvé une multitude d’articles au sein de la communauté qui m’ont permis d’effectuer ces montées de version sans douleur. Je vous propose ici de regrouper ces informations.
Je pars du principe que vous connaissez Composer et que votre projet est déjà en place avec lui.
Dans un premier temps, si ce n’est pas déjà fait, nous allons passer notre projet Composer vers drupal/core-recommended et nous mettrons à jour nos fichiers du Core. Dans un second temps, nous monterons la version de nos modules contribués. Puis, je vais vous parler de plusieurs plugins Composer qui sont utiles à Kaliop avec Drupal. Nous terminerons par le passage vers Drupal 9.
Migrer son projet Composer vers 8.8.0 et mettre à jour le core de Drupal
Avant la version 8.8.0 de core de Drupal, nous utilisions dans Composer la combinaison des packages “webflo/drupal-core-strict » et “drupal/core”. Depuis, un nouveau template Composer pour Drupal est sorti. Il se nomme “drupal/core-recommended”. Il permet une sécurisation des dépendances du core de Drupal. C’est-à-dire que la version de Drupal que vous utilisez actuellement utilise exactement les mêmes versions de dépendances (Symfony, Guzzle, Twig, Laminas,…) testées pour le développement de votre version de Drupal.
Comment savoir si vous l’utilisez déjà ? En lançant tout simplement cette commande :
composer show drupal/core-recommended
Si des informations vous sont retournées sur le package, c’est que vous êtes à jour et vous pouvez passer au chapitre suivant. Sinon, voici une procédure à suivre, bien qu’elle doive être adaptée à chaque projet.
Pour commencer nous allons supprimer les packages que nous n’allons plus utiliser :
composer remove drupal-composer/drupal-scaffold
composer remove drupal/core
composer remove webflo/drupal-core-strict
composer remove webflo/drupal-core-require-dev
Ensuite, nous allons ajouter les nouvelles dépendances dont nous avons besoin. Durant l’ajout de ces nouvelles dépendances, je me suis retrouvé avec de nombreux conflits de versions. Si ce problème vous arrive, voici ce que je vous préconise :
- Soit de mettre à jour les modules contribués existants en amont. Mais il y a un risque d’anomalies sur ces modules en fonction des retards pris dans leur monté de version.
- Soit l’option que je vous recommande, mais qui est plus lourde à mettre en place. Elle consiste à fixer la version de l’ensemble des modules contribués. Une fois cela fait, on enlève l’ensemble des require drupal/{module} et on garde ces lignes dans un fichier à part. On doit se retrouver avec un “require” qui ne contient plus de dépendance commençant par “drupal/*”. Voici la liste de commandes à lancer :
composer update
composer require drupal/core-composer-scaffold "version"
composer require drupal/core-recommended "version"
composer require drupal/core-dev "version" --dev
Enfin, on remet l’ensemble des modules précédemment enlevé dans leur version fixée et on relance la commande :
composer update
Vous vous retrouvez alors avec un fichier composer.json et composer.lock qui suit le nouveau standard.
Je vous rajoute deux commandes qui m’ont été utiles pour comprendre les problèmes de dépendances que j’ai pu avoir lors de ces montées de version.
Cette commande vous indique quels sont les paquets qui ont en dépendance un paquet donné :
composer why drupal/commerce -t -r
Cette commande vous indique quels sont les dépendances de ce paquet donné :
composer show --tree drupal/commerce
A consulter :
https://www.drupal.org/docs/updating-drupal/updating-drupal-core-via-composer
Mettre à jour vos modules contrib
Maintenant que nous avons le core de Drupal à jour, nous pouvons nous concentrer sur la mise à jour de nos modules. Pour lister les modules qui ne sont pas à jour, vous pouvez lancer cette commande :
composer outdated –direct
Si vous souhaitez vous concentrer sur les modules avec des failles de sécurité :
drush pm:security
Je vous conseille de mettre à jour vos modules un par un :
composer update drupal/modulename --with-dependencies
Enfin, pensez bien après chaque mise à jour à actualiser la base de données, vider les caches et exporter les potentielles modifications :
drush updatedb --no-post-updates
drush cache:rebuild
drush updatedb
drush cache:rebuild
drush config:export –diff
À consulter : Updating Modules and Themes using Composer
Liste de plugins Composer supplémentaires
Voici une liste de packages supplémentaires bien utiles, dont on se sert en fonction du contexte à ajouter à Composer.
Composer-patches
Package qui applique un correctif à partir d’un fichier local ou distant à tout paquet requis avec Composer.
Prestissimo et Optimize Composer for Drupal projects
Prestissimo et Optimize, deux plugins qui permettent d’optimiser les performances de Composer avec Drupal.
A l’heure où j’écris cet article, Composer 2 est sorti. La communauté, hyper réactive, a déjà rédigé un article pour vous préparer à y passer .
Composer Manifest
Un plugin Composer qui maintient un simple fichier YAML listant tous les paquets installés avec leur numéro de version.
Dotenv Component
Symfony Dotenv analyse les fichiers .env pour rendre les variables d’environnement qui y sont stockées accessibles via $_SERVER ou $_ENV.
Pour les mots de passe et clés d’API, je ne préconise pas cette solution. Nos amis de Kuzzle ont créé un outil.
Drupal Finder
Fournit une classe permettant de localiser une installation Drupal dans un chemin donné.
File Path Utility
Cet ensemble offre des fonctions utilitaires robustes et multi-plateformes pour normaliser, comparer et modifier les chemins d’accès aux fichiers et les URL.
En route vers Drupal 9
À ce moment de l’article, votre site est au top de sa forme (ou en carafe.. on connaît tous les montées de version qui se passent mal…). Peut-on envisager de passer à Drupal 9 ?
Théoriquement, oui. Mais en pratique, pas toujours… cela va dépendre de la compatibilité des modules contribués et custom que vous avez installés. Drupal 8.8.0 est la première version totalement compatible pour passer à Drupal 9. Si vous souhaitez savoir où vous en êtes, nous vous conseillons le module “Upgrade status”. Il scanne le dossier “modules” et vous indique pour chaque module s’il est Drupal 9 friendly.
Si votre site est remonté comme D9 friendly, alors vous pouvez lancer les commandes :
composer require drupal/core-recommended:~9.0.0@dev --no-update
composer require --dev drupal/dev-dependencies:~9.0.0@dev --no-update
composer update
Nous voici à la fin de cette belle aventure. Comme je l’ai dit en début d’article, merci aux auteurs de l’ensemble de ces excellentes sources d’information qui m’ont aidé à la rédaction et j’espère que cet article aura pu vous aider.
Développeur Web