Blog image 10 tricks to work efficiently with the Composer in Drupal 8

10 astuces pour travailler efficacement avec le Composer dans Drupal

De nos jours, Composer est l'un des outils les plus importants dans le monde PHP, car il permet aux développeurs de gérer les bibliothèques externes tout en facilitant leurs mises à jour continues. Chez Droptica, nous faisons beaucoup de développement Drupal et nous ne pouvons pas imaginer la vie sans Composer. Si vous voulez travailler efficacement avec Drupal sans utiliser Composer, lisez les 10 conseils suivants pour vous aider à mieux comprendre et exploiter la puissance de ce gestionnaire de paquets populaire.

1. Mettez à jour à la fois les modules et le noyau avec Composer

Drupal et Composer peuvent fonctionner ensemble, mais les conditions pour une telle coopération sont assez spécifiques, notamment en ce qui concerne les mises à jour du noyau. Certains projets plus anciens sont configurés de manière à ce que Composer ne puisse télécharger que les modules, les thèmes et les bibliothèques externes. Le noyau lui-même doit être mis à jour manuellement.

Devoir mettre à jour manuellement rend l'utilisation d'un gestionnaire de paquets inutile, mais il y a une solution simple à ce problème. Vous pouvez utiliser le modèle disponible sur https://github.com/drupal/recommended-project. Je ne saurais trop recommander ce moyen de lancer de nouveaux projets dans Drupal – ici chez Droptica, nous l'utilisons pour la grande majorité de nos projets. Il vous permet de ne stocker que votre propre code dans le dépôt, sans dépendances externes. Lorsqu'une nouvelle version de Drupal est publiée, il vous suffit de la télécharger en exécutant :

composer update drupal/core --with-all-dependencies

2. Accélérez les choses avec hirak/prestissimo

Composer n'est guère connu pour sa rapidité ou son efficacité en matière de ressources. L'une des raisons en est la nature séquentielle de la commande d'installation. Les bibliothèques suivantes sont téléchargées l'une après l'autre et en cas d'indisponibilité, l'installation ne progressera pas et ne fera que s'allonger.

Pour surmonter cette limitation, activez le plugin Prestissimo (https://github.com/hirak/prestissimo). Cela permet à Composer d'effectuer des téléchargements parallèles. Grâce à ce plugin, même le projet le plus complexe sera installé plusieurs fois plus rapidement qu'auparavant.

composer global require hirak/prestissimo

Quels sont les inconvénients potentiels de Prestissimo ? Tout d'abord, il peut y avoir des problèmes avec les dépôts privés (vous devez définir les jetons et clés nécessaires dans le fichier auth.json), et ensuite – à partir de la version 2.0 de Composer, le plugin deviendra redondant – il sera remplacé par le support curl-multi.

3. Réduisez l'appétit de Composer pour la mémoire avec Drupal Optimizations

Dans le conseil précédent, j'ai mentionné l'amour de Composer pour la RAM. Dans le cas de Drupal, ce phénomène est encore exacerbé par une multitude de dépendances externes, notamment celles de Symfony. Ce problème a déjà été remarqué par les communautés Symfony et Drupal. La solution sous forme de plugin Composer a été conçue et développée par Jakub Piasecki, un développeur polonais.

Pour ajouter Drupal Optimizations à votre projet, exécutez :

composer require zaporylie/composer-drupal-optimizations:^1.1

Comment fonctionne le plugin ? Il suppose que vous utilisez la version Drupal >= 8.5. Sur cette base, il évite de vérifier les anciens tags dans les dépôts de composants Symfony. L'optimisation de Composer par cette méthode réduit sa consommation de mémoire à moins d'un tiers, du moins selon l'auteur du plugin. Cela fait que la commande composer update s'exécute beaucoup plus rapidement.

4. Contrôlez la limite de mémoire disponible

Si les deux plugins susmentionnés ne suffisent pas et que vous rencontrez toujours des problèmes de dépassement de la limite de mémoire, la seule façon de résoudre le problème pourrait être de l'augmenter. La documentation officielle fournit plusieurs moyens de le faire. Composer essaie d'augmenter la limite à 1,5 Go chaque fois qu'il démarre, mais même cela n'est souvent pas suffisant.

Si vous constatez que Composer ne réagit pas au changement de la valeur limite, assurez-vous de modifier le bon fichier de configuration – vérifiez tout d'abord s'il est inclus dans la liste affichée après l'exécution de la commande php --ini. Vous devez également vous assurer que le serveur sur lequel vous exécutez Composer permet une telle consommation élevée de mémoire. Si vous rencontrez des problèmes avec composer update, n'oubliez pas que vous pouvez l'exécuter localement avec une limite plus élevée et générer un fichier composer.lock, puis l'utiliser pour exécuter la commande composer install sur le serveur – cela utilisera définitivement beaucoup moins de ressources.

5. Découvrez la commande outdated et l'option --dry-run

La plupart des utilisateurs de Composer utilisent principalement les commandes install et update. Il n'y a rien de mal à cela... Jusqu'à ce que vous ayez besoin d'un contrôle plus poussé sur le processus de mise à jour. Si vous voulez savoir ce que la commande composer update va faire, exécutez-la avec l'option --dry-run. Comme son nom l'indique, elle s'exécutera alors « à blanc », sans introduire de modifications au code.

Une autre façon de voir les mises à jour disponibles est d'exécuter la commande composer outdated. Elle fournit un aperçu clair de tous les paquets à mettre à jour (une couleur distincte est utilisée pour les paquets avec des versions plus récentes qui sont bloquées par des restrictions mises en œuvre dans composer.json). C'est une excellente alternative au module Update Manager.

6. Convertissez votre projet avec Composerize

Si vous avez déjà un projet Drupal qui n'est pas maintenu en utilisant Composer, n'ayez crainte ! Vous pouvez utiliser plusieurs outils qui peuvent générer un fichier composer.json basé sur le code trouvé dans un projet donné. Le plugin le plus couramment utilisé ? Ce serait grasmash/composerize-drupal. Vous pouvez l'installer en exécutant :

composer global require grasmash/composerize-drupal

Après avoir exécuté les commandes suivantes (en supposant que [repo-root] est le chemin du répertoire racine du projet, et [drupal-root] est le chemin vers index.php), vous obtiendrez un fichier composer.json contenant tous les modules, thèmes et profils du projet, configuré pour gérer les patchs et télécharger des paquets depuis https://asset-packagist.org/.

cd path/to/drupal/project/repo
composer composerize-drupal --composer-root=[repo-root] --drupal-root=[drupal-root]

L'exécution de composer install installera les dernières versions des modules et remplacera les actuelles. À partir de ce moment, les dépendances externes n'auront plus à être stockées dans le dépôt du projet – il suffit de placer les fichiers composer.json et composer.lock dans ce dépôt.

7. Apprenez-en plus sur Asset Packagist

Composer est principalement utilisé pour gérer les paquets PHP ; cependant, il peut aussi fonctionner avec les dépôts NPM et Bower. Cela est particulièrement utile si vous souhaitez maintenir à jour les dernières versions des bibliothèques frontend (comme Colorbox ou Slick). Cela est rendu possible par le projet Asset Packagist (https://asset-packagist.org).

Afin de pouvoir utiliser des bibliothèques supplémentaires, définissez un nouveau dépôt dans composer.json :

"repositories": [
    {
        "type": "composer",
        "url": "https://asset-packagist.org"
    }
]

N'oubliez pas de changer l'emplacement des bibliothèques pour un compatible avec Drupal. Pour ce faire, assurez-vous que votre projet inclut l'add-on composer/installers :

composer require composer/installers

Ajoutez ensuite les entrées suivantes dans la section "extras" de composer.json :

"extra": {
    "installer-types": ["bower-asset", "npm-asset"],
    "installer-paths": {
      "web/libraries/{$name}": ["type:bower-asset", "type:npm-asset"]
    }
}

Supposons que vous vouliez ajouter Colorbox à votre site web. Tout d'abord, vous devez le trouver sur https://asset-packagist.org/, puis cliquez sur son titre et attendez que Asset Packagist télécharge les informations sur Colorbox dans son dépôt (cette étape n'est pas toujours nécessaire, elle peut être nécessaire pour les bibliothèques moins populaires).

Copiez le nom complet du paquet avec le préfixe npm-asset/bower-asset et exécutez :

composer require npm-asset/jquery-colorbox

Si tout se passe bien, Colorbox sera ajouté au répertoire web/libraries de votre projet.

Une chose importante à propos de Asset Packagist – Je dois souligner que son utilisation n'a de sens que si vous devez télécharger une bibliothèque unique vers le projet sans dépendances supplémentaires, dans l'état exact et la forme trouvés dans le dépôt. Composer ne pourra pas remplacer npm install colorbox, qui en plus de Colorbox télécharge et installe n'importe où de plusieurs dizaines à plusieurs centaines de dépendances. Cette approche a quelques avantages et inconvénients. L'un des principaux avantages est l'économie d'espace et l'évitement du téléchargement de fichiers inutiles, et l'un des plus grands inconvénients est l'incapacité à exécuter du code dérivé de NodeJS. En d'autres termes, vous aurez plus de facilité à mettre à jour les bibliothèques frontend, mais vous payez cela par la perte de la capacité à les compiler vous-même.

8. N'ayez pas peur d'utiliser les Patches de Cweagan

L'utilisation de fichiers .patch est courante dans Drupal et a une histoire extrêmement longue. Composer facilite la gestion des patchs et le contrôle de leurs ensembles avancés. Commençons par une commande ajoutant le plugin Cweagan's Patches au projet :

composer require cweagans/composer-patches

Ajoutez la configuration nécessaire dans composer.json :

"patches": {
    "drupal/core": {
        "Fix everything": "patches/core_fix_everything.patch",
        "Fix one more thing": "https://www.drupal.org/files/issues/fix-one-more.patch"
    },
    "drupal/colorbox": {
        "Fix something": "patches/colorbox_fix_something.patch",
    }
}

Les fichiers de patch peuvent être localisés à la fois dans votre dépôt, ainsi que quelque part en ligne. Vous pouvez trouver plus d'options de configuration dans la documentation sur https://github.com/cweagans/composer-patches. Tous les patchs de la liste ci-dessus seront automatiquement appliqués aux fichiers originaux la prochaine fois que vous exécuterez composer update.

Quels sont les avantages d'utiliser les Patches de Cweagan ? Tout d'abord, vous aurez maintenant tous les patchs en un seul endroit, et vous pourrez oublier de les appliquer manuellement – Composer s'en chargera. Cependant, vous devez toujours vous assurer que les modifications contenues dans les patchs ne sont pas déjà incluses dans les versions plus récentes des paquets mis à jour.

9. Un peu de paranoïa n'a jamais tué un développeur Drupal

Drupal est un projet orienté sécurité, mais en même temps, son architecture peut être une source de certains risques potentiels. Cela concerne principalement la structure du répertoire, qui vous oblige à placer trop de fichiers avec du code PHP dans le webroot – le répertoire accessible depuis l'extérieur. Malgré le fait qu'une configuration appropriée élimine la possibilité de lire ce code, les pratiques modernes – principalement promues par Symfony – visent à laisser les fichiers destinés à l'utilisateur final dans webroot.

L'intégration de Drupal avec Composer a ouvert de nouvelles possibilités pour protéger les fichiers PHP contre un accès accidentel. Théoriquement, tous les chemins des bibliothèques téléchargées peuvent être modifiés librement, car l'autoload se charge de les trouver. Le cas extrême de l'utilisation de cette fonctionnalité de Composer est le modèle https://github.com/drupal-composer/drupal-paranoia. Il oblige tous les fichiers du projet à être stockés dans un répertoire /app séparé, ne rendant que des liens symboliques vers des ressources telles que index.php ou les répertoires sites/*/files disponibles pour le monde extérieur.

Bien sûr, l'utilisation de cette approche nécessite l'exécution d'un système *nix.

10. Optimisez votre version de production

Il y a quelques règles de base concernant l'utilisation de Composer dans un environnement de production. Les suivre augmentera la sécurité de votre site web et l'accélérera :

  • Utilisez uniquement la commande composer install dans l'environnement de production et assurez-vous que composer.lock est toujours dans le dépôt. Si vous autorisez l'exécution de composer update, vous pourriez vous retrouver avec des conséquences imprévues. Vous devriez toujours faire les mises à jour dans un environnement de développement – Cette approche vous permettra d'éviter les problèmes d'incompatibilités des nouvelles versions.
  • Utilisez l'option composer install --no-dev pour empêcher l'installation des bibliothèques de développement. Celles-ci sont déclarées dans la section require-dev de composer.json.
  • Utilisez l'option composer install --optimize-autoloader pour construire une carte des classes. Grâce à cela, l'autoloader ne cherchera pas les fichiers sur le disque selon les règles PSR-4/PSR-0, mais obtiendra un chemin vers un fichier avec sa définition basé sur le nom de la classe. Activer cette optimisation dans l'environnement de développement est gênant, car cela nécessite de nettoyer le cache après chaque changement dans la structure des fichiers du projet.
3. Best practices for software development teams