keyboard_arrow_up

Appliquer un correctif a une dépendance Composer par application d'un patch

Rédigé par Sylvain Lavielle
Développeur web freelance expert Drupal sur Toulouse

Le 21/08/2019

Composer est un gestionnaire de dépendances dont l'usage est quasiment normalisé sur tous les projets PHP récents. Il permet de récupérer et mettre à jour les librairies PHP tierces dont votre projet dépend (et éventuellement les librairies dont elles dépendent elles-même) de manière automatisée.

Ainsi, il est d'usage que le code sources des librairies tierces (ou dépendances) ne soit pas ajouté au dépôt de sources (généralement git) du projet. Ces librairies pourront ensuite être récupérés au besoin sur les différents environnements nécessaires au cycle de vie du projet grâce à Composer.

Cas d'un bug dans une dépendance

Éviter de stocker le code source des dépendances et pouvoir les récupérer au besoin est une excellente solution mais qui pose cependant un problème : Certaines dépendances peuvent contenir des bugs et il peut être alors nécessaire de les corriger.

Idéalement, quand on est dans ce genre de cas, la bonne pratique open-source est de :

  • forker le dépôt GitHub original de la dépendance en question, 
  • faire le correctif, 
  • le commiter dans votre dépot forké
  • de soumettre la correction à l'auteur de la librairie via une pull-request.

Si votre correctif lui semble bon, l'auteur de la librairie va accepter votre pull-request, la merger dans le dépôt original de la librairie, puis finalement l'intégrer à la prochaine release de sa librairie qui deviendra donc à ce moment disponible via Composer.

il vous faudra alors faire un :

$ composer update vendor/package

Pour mettre à jour la dépendance

Néanmoins, le processus d'intégration de votre correctif à la librairie original prendra naturellement un certain temps et parfois un temps certain : à moins que votre correctif ne règle un problème critique, l'auteur attendra vraisemblablement d'avoir un certain nombre de correctifs ou d'évolution à publier avant de faire une nouvelle release de sa librairie. L'intégration de votre correctif peut même ne jamais aboutir : C'est au bon vouloir de l'auteur de la librairie et c'est aussi fonction de sa disponibilité et de sa réactivité.

Créer un patch et l'appliquer via Composer

En attendant ce jour béni où l'auteur de la librairie intégrera votre correctif à sa prochaine release, il va vous falloir trouver une solution pour que tous les développeurs de votre projet disposent du correctif et que vous puissiez intégrer celui-ci lors des déploiements sur les différents environnements de votre projet sans que cela ne devienne compliqué à gérer.

Pour couvrir ce cas, le plugin de Composer composer-patches permet d'appliquer automatiquement un patch lors de son processus de récupération/mise à jour des dépendances. Voici comment il fonctionne.

Créer un fichier patch

Tout d'abord il va vous falloir créer un fichier patch de votre correctif. Le fichier patch peut être créé avec git en utilisant la version locale du dépôt de la librairie que vous avez forké et qui doit déjà contenir votre correctif. Vérifiez que votre correction est bien détectée par git diff en utilisant la commande suivante :

$ git diff [commit_hash]

[commit_hash] est l'identifiant (hash) du commit précédent celui avec lequel vous avez commité le correctif

Puis, si tout vous semble correct vous pouvez générer votre patch ainsi :

$ git diff commit_hash > my_target_dir/my_patch.patch

Appliquer le fichier patch avec Composer

Créez un répertoire nommé patches pour héberger vos patches (généralement situé au même niveau du fichier composer.json).

Puis, ajoutez la dépendance à composer-parches à votre projet :

$ composer require cweagans/composer-patches

Enfin, dans votre fichier composer.json, ajoutez une nouvelle section patches dans la section extra et y référencer votre fichier patch comme ceci :

{
  ...
  "extra": {
    ...
    "patches": {
      "vendor/package": {
        "Comment about the fix": "patches/vendor/package/my_patch.patch"
      }
    }
  }
}

vendor/package est le nom de la librairie à patcher telle qu'elle apparaît dans la section require de votre fichier composer json. En général, on réutilise cette structure pour les sous-répertoires du répertoire patch (dans la même logique que le répertoire vendor de composer).

Avec votre fichier composer json ainsi modifié, votre patch sera automatiquement appliqué à votre dépendance par Composer lorsque vous faites un composer install ou un composer update.

 

Sujets abordés dans cet article