écrit le  31-10-2017 - mis à jour le 13 janvier 2021

Composer

Si comme moi, tu refusais de quitter l’îlot de tes habitudes de drupalien version 7 (drush, git), sache que ça ne va plus être possible. Tel le pouvoir madrilène qui dicte ses lois à la Catalogne, drupal version 8 t’impose COMPOSER !

En un mot comme en cent, "composer" est un gestionnaire de dépendances. Que cela veut-il dire ?

Principalement que dorénavant quand:

  • tu installeras* un module en local, tu n’exécutera plus un vulgaire drush dl devel (par exemple) mais un magnifique

    composer require drupal/devel
    (drush en devel sera pour autant toujours utile),

    dans le cas où il te faut installer une version spécifique :

    composer require drupal/linkit:^6.0
  • tu voudras supprimer* un module drupal, tu enverras un implacable

    composer remove drupal/nom_du_module
  • tu mettras à jour* un module drupal, tu n'utiliseras plus drush up monmodule mais

    composer update drupal/nom_du_module
  • tu mettras à jour ta prod, tu n’exécuteras plus un ordinaire drush updb après un git pull mais un élégant composer

    drush cim //pour config import<:pre> 

    Ce dernier se basera sur les fichiers composer.json et composer.lock pour savoir quels sont les modules dont il a besoin.

* Attention

Composer est un gestionnaire de paquet ce qui veut dire, en résumé, qu'il s'assure que les projets et modules que vous installez et désinstallez sont compatibles entre eux mais en réalité, il n'installe rien ou ne désinstalle rien lui même ! Il se content d'aller chercher le code compatible et c'est ensuite à vous d'activer ou de désactiver. Donc avant d'utiliser les commandes :

  • composer require, il faut ensuite activer (avec drush par exemple) le module concerné
  • composer remove, il faut auparavant avoir désactivé le module concerné
  • composer update, il faut ensuite lancer le processus de mise à jour de la base de données (drush updb par exemple)

Installer composer

C’est facile :

 

Exporter et importer la config

Vous pouvez constater qu’après avoir installé drupal 8.5 (ou supérieur), votre fichier settings.php contient la ligne

$config_directories['sync'] = '../config/sync';

Cela indique que les variables de configuration (comme le nom de votre site ou encore les modules activés, enfin tout ce qui fait de votre site drupal, un site web spécifique) seront exportées dans un répertoire hors d’atteinte d’une requête http (répertoire web), dans le répertoire config/sync.

Logiquement, il vous suffira d’exporter la config de votre serveur de test pour l’importer ensuite sur vos serveurs de préprod puis de prod.

  • Exporter la config : drush cex
  • Importer la config : drush cim

1 Installer un site drupal la première fois depuis une configuration existante

Pour que votre futur site de prod ou de preprod puisse être directement installé en prenant compte votre configuration, il va falloir utiliser le module « configuration installer ».

Pour cela, en local, exécuter :

composer require drupal/config_installer
drush cex
git add ../config
git commit -m "config exported."
git push

Sur le serveur du site à installer d’après votre configuration locale :

git pull
composer install

Puis  :

  • vérifier que le répertoire web/profiles/contrib/config_installer est bien présent,
  • vérifier que le fichier .htaccess est présent et que le mode rewrite d'apache est activé,
  • lancer l’installation de votre site dans le navigateur et dès la deuxième étape, choisissez le profil d’installation « Configuration installer »,
    déroulez l’installation et vous verrez qu’à la 5ième étape, le champ « Synchronisation directory » aura comme valeur par défaut « ../config/sync ». Toutes les variables de configuration sont bien prises en compte. Si l'installation plante, c'est sans doute un problème de timeout. N'hésitez pas à relancer l'install en lançant un simple rechargement de la page (F5).
    ou lancer l'install depuis drush mais je n'y suis pas encore arrivé (j'ai testé  :
    drush site-install --verbose --locale=fr config_installer config_installer_sync_configure_form.sync_directory=../config/sync --yes  (en admettant que l'on se trouve dans le fichier racine de drupal soit par défaut web) ... mais ça ne fonctionne pas ... il faut creuser. Si vous avez la solution, merci de me l'envoyer à contact@coopernet.fr

2 Mettre à jour les modifications de configuration exportées tout au long de la vie de votre site web

Lorsque vous apportez des modifications de configuration en local, il vous faudra les exporter, les "commiter" puis les importer sur vos serveurs de pré-prod et de production.

Notez au passage qu'il faut exporter composer.json et composer.lock.

Dans composer.json, on va trouver des informations du type : "drupal/entity_browser": "^2.0.0" 
ce qui veut dire que vous voulez installer le module entity_browser à partir de sa version 2.0

Dans composer.lock, on va trouver des informations du type : 

     "name": "drupal/entity_browser",
      "version": "2.0.0-alpha3",
Ce qui veut dire que c'est exactement la version 2.0.0-alpha3 qui sera installé

On a donc besoin de "commiter" ces deux fichiers pour installer exactement les mêmes versions des modules de drupal en en local et en prod.

Pour exporter :

drush cex

Pour le versioning, utilisez git de façon classique :

git add xxx

git ci - m "Votre message de commit"

git push

Pour importer

git pull

composer install

drush cim

drush cr

3 Drush

Pour pouvoir travailler correctement avec drupal 8.4 et supérieur, il faut installer au minimum la version 8.1.15 :

composer global require drush/drush:8.1.15

Attention également à utiliser dans le répertoire web pour la plupart des commandes (ex : drush en devel)

4 Les commandes à connaître pour s'en sortir dans ce nouveau monde :

Mettre à jour un module contrib particulier

composer update drupal/nom_du_module

Mettre à jour le coeur de drupal

composer update drupal/core --with-dependencies
drush updatedb
drush cr

http://www.coopernet.fr/infos/drupal-8-4-composer-drush-git-config-export-et-importActiver un module, en pour enable (territoire connu)

drush en nom_du_module

Vider tous les caches, équivalent à l'ancien drush cc all

drush cr 

Désinstaller un module contrib

composer remove drupal/nom_du modulecontrib

Activer / désinstaller un module custom (u pour uninstall)

Attention, composer ne s'occupe que des modules contrib. Les modules custom ne le concerne pas. Ainsi pour un activer et désinstaller un module custom, il faudra utiliser les commandes drush usuelles :

drush en nom_du module_custom
drush pmu nom_du module-custom

 

Eviter les problèmes de mise à jour de la base de données

Si lors de la mise à jour de drupal vous tombez sur une erreur de type : session_id(): Cannot change session id when headers already sent AbstractProxy.php:94 > [notice] Update started: system_update_8804 > [error] SQLSTATE[23000]: Integrity constraint violation: 1062, il est probable que ce soit lié au fait que vous n'avez pas vraiment supprimer toutes les tables de votre ancienne base de données. En effet, exécuter la commande 

drush sql-cli < chemin/vers/votrebd.sql 

ne supprime pas toutes les tables. Il faut donc commencer par :

drush sql-drop

Problème pour passer de drupal 8.6 à 8.8

Sans que je ne puisse exactement vous expliquer pourquoi, je vous livre ce que j'ai dû faire pour passer de drupal 8.6 à drupal 8.8 avec composer

composer require drupal/core:^8.8.1 --no-update
composer require webflo/drupal-core-require-dev:^8.8.1 --no-update
composer update drupal/core webflo/drupal-core-require-dev --with-dependencies

Pour passer de 8.7 à 8.8

Voir l'article de blog

Pour passer de 8.8.1 à 8.9.11

composer update drupal/core --with-dependencies
composer require drupal/core:^8.8.12 --no-update
composer require webflo/drupal-core-require-dev:^8.8.12 --no-update
composer update drupal/core webflo/drupal-core-require-dev --with-dependencies
Tags