Automatisation du flux de travail PHP CS Fixer pour les commits Git

Nous utilisons tous le PHP Code Style Fixer. Nous l’adorons tous ! Mais nous n’aimons pas cliquer sur le bouton « composer fix » à chaque fois avant de pousser nos changements. Je vous promets que vous allez adorer l’utilitaire Lefthook, car il automatise l’une des actions les plus fréquentes dans les projets PHP.

PHP CS fixer visualisation
Уявлення PHP CS Fixer у поєднанні з LeftHook з точки зору ШІ

Tôt ou tard, chaque développeur dans sa vie connaîtra la joie des outils automatiques de correction de code. Cela nous fait gagner du temps et améliore la qualité du code. Cependant, avec le temps, chaque développeur est confronté au problème d'automatiser de tels processus. Nous n'aimons pas déclencher manuellement les workflows de correction de code, en gaspillant notre temps et notre concentration sur de telles choses basiques.

Mon parcours

J'ai essayé différents outils. Des commits directs dans le répertoire .git/hooks à Husky. Je cherchais une solution parfaite pour l'automatisation des corrections de code dans mes projets. L'un des outils les plus populaires à cet effet est Husky.

Pourquoi je n'aime pas Husky ?

  • Configuration complexe. La configuration de Husky passe par trop d'étapes et ne dispose pas de fonctions riches prêtes à l'emploi pour simplifier la configuration.

  • Environnement Node.js. Un outil si simple nécessite l'installation de NodeJS. Cela entraîne une surcharge de performance lors de l'installation et de l'utilisation.

  • Gestion des dépendances. Pour installer Husky, vous devez disposer d'un gestionnaire de paquets tel que NPM, PNPM ou Bun. Chacun d'eux encombre votre ordinateur avec des éléments inutiles et rend la configuration de l'outil plus complexe.

J'ai trouvé la solution parfaite pour moi

En parcourant la liste des dépôts sur GitHub, j'ai découvert l'outil ultime pour les développeurs nommé Lefthook. Alors, pourquoi l'ai-je aimé ?

  • Utilise un langage compilé

    • Excellente performance

    • Aucun gestionnaire de paquets ou runtime requis

    • Peut être intégré dans n'importe quel environnement sans prise de tête

    • Fourni sous forme d'un seul binaire

  • Syntaxe YAML utilisée pour les fichiers de configuration. YAML est un langage de balisage bien connu pour les fichiers de configuration dans les workflows CI pour la plupart des projets, comme GitHub Actions. Il est utilisé dans la plupart des projets open-source.

  • La plupart des configurations peuvent être faites avec des utilitaires intégrés. Lefthook dispose d'un ensemble riche d'options de configuration. Pas besoin de connaître les internals de git pour configurer des tâches basiques comme la correction automatique de code ou le lint de code.

  • Bon support des monorepos

Configuration de Lefthook avec PHP CS Fixer

Trop d'introduction pour une action si courte. Au moment de la rédaction de cet article, la dernière version de Lefthook est la 1.6.4. Allons-y étape par étape.

  • Installez et configurez PHP Code Style Fixer comme décrit dans leur Readme.

  • Installez Lefthook par n'importe quelle méthode souhaitée listée dans le guide d'installation. Sur macOS, je le fais via le gestionnaire de paquets brew : brew install lefthook.

  • Créez un fichier de configuration nommé lefthook.yml à la racine de votre projet. Attention ! Il doit être situé à la racine du dépôt git même si vous utilisez un monorepo.

  • Mettez le contenu suivant dans le fichier lefthook.yml.

    pre-commit:
      commands:
        web-cs-fixer:
          tags: style fixer
          glob: "*.php"
          stage_fixed: true
          run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}
    

Exécutez la commande lefthook install pour appliquer les changements. Attention ! Lefthook utilise des hooks git en arrière-plan, donc après toute mise à jour du fichier de configuration, vous devez exécuter à nouveau lefthook install.

C'est tout. Bon codage !

Explication des propriétés

  • Le template {staged_files} est une variable intégrée utilisée pour fournir la liste des fichiers modifiés.

  • La propriété glob est utilisée pour filtrer les fichiers sur lesquels vous voulez exécuter la commande.

    • *.php signifie que PHP CS Fixer ne s'exécutera que sur les fichiers php, évitant les conflits avec d'autres extensions.
  • stage_fixed est ma partie préférée. Elle s'occupe de réajouter les fichiers modifiés à git (pas besoin d'exécuter la commande git add).

  • run contient la commande que vous voulez exécuter avant chaque commit.

Configuration du monorepo

Dans l'un de mes projets, j'utilise une conception de monorepo avec docker. L'un des conteneurs est une application PHP Symfony. Il y a une solution simple pour ce cas.

Pour exécuter PHP CS Fixer dans un monorepo, il y a la propriété root dans la configuration. Mettez à jour votre lefthook.yml à la racine du projet avec la configuration suivante.

pre-commit:
  commands:
    web-cs-fixer:
      tags: style fixer
      root: "path/to/docker_containers/php_web_app/"
      glob: "*.php"
      stage_fixed: true
      run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}

Remplacez path/to/docker_containers/php_web_app/ par le chemin vers le répertoire de votre projet PHP. Attention ! Le chemin doit se terminer par un slash '/'.