Linter et formater automatiquement le code avant les commits

Discourse utilise lefthook pour les hooks git, et bin/lint comme point d’entrée CLI principal pour exécuter manuellement les mêmes vérifications.

Si vous travaillez dans un clone local, installez les hooks une seule fois :

pnpm install
pnpm lefthook install

Ensuite, les fichiers mis en scène seront vérifiés automatiquement lors de git commit.

La commande principale : bin/lint

Utilisez bin/lint lorsque vous souhaitez exécuter vous-même les linters configurés pour le dépôt au lieu d’attendre le hook pre-commit.

Exemples courants :

bin/lint
bin/lint path/to/file.rb path/to/file.gjs
bin/lint --recent
bin/lint --staged
bin/lint --unstaged
bin/lint --wip
bin/lint --fix path/to/file.rb
bin/lint --fix --recent
bin/lint --fix

Ce que fait chaque mode

  • bin/lint : vérifie tous les fichiers pris en charge dans le dépôt
  • bin/lint path/to/file ... : vérifie uniquement les fichiers spécifiés
  • bin/lint --recent : vérifie les fichiers modifiés au cours des 50 derniers commits, ainsi que les fichiers non suivis
  • bin/lint --staged : vérifie uniquement les fichiers mis en scène
  • bin/lint --unstaged : vérifie uniquement les fichiers non mis en scène
  • bin/lint --wip : vérifie les fichiers mis en scène, les fichiers non mis en scène et les fichiers modifiés depuis main
  • bin/lint --fix ... : exécute les correcteurs automatiques pour les fichiers sélectionnés
  • bin/lint --fix : exécute tous les correcteurs automatiques disponibles dans le dépôt
  • bin/lint --verbose : affiche les commandes lefthook sous-jacentes

Lorsque vous passez des fichiers explicites, bin/lint les filtre aux types de fichiers lintables pris en charge avant d’invoquer lefthook.

:information_source: Les fichiers de documentation Markdown ne font pas actuellement partie de bin/lint, donc l’exécution de bin/lint path/to/doc.md indiquera qu’il n’y a aucun fichier correspondant à vérifier.

Ce qui est vérifié

La configuration exacte se trouve dans lefthook.yml. Au moment de la rédaction, bin/lint couvre :

Ruby

  • **/*.{rb,rake,thor}
  • Scripts Ruby sous bin/**/*
  • Gemfile

Vérifications :

  • rubocop
  • syntax_tree (stree check)

Formatage JavaScript, GJS, CSS et SCSS

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • Fichiers d’actifs correspondants pour les plugins et les thèmes

Vérifications :

  • prettier/pprettier

Vérification JavaScript et GJS

  • frontend/**/*.{js,gjs}
  • Fichiers JS correspondants pour les plugins et les thèmes

Vérifications :

  • eslint (avec les règles template-* de eslint-plugin-ember couvrant la partie template des fichiers .gjs)

Vérification SCSS

  • app/assets/stylesheets/**/*.scss
  • Fichiers SCSS correspondants pour les plugins et les thèmes

Vérifications :

  • stylelint

Vérifications YAML et locales

  • **/*.{yaml,yml} sauf config/database.yml
  • **/{client,server}.en.yml

Vérifications :

  • yaml-lint
  • script/i18n_lint.rb

Vérification des types

Lorsque vous exécutez bin/lint sans arguments de fichier, la vérification complète du dépôt est également exécutée :

  • pnpm lint:types

Il s’agit de la vérification de style Glint/TypeScript pour les informations de type JavaScript de Discourse.

:information_source: bin/lint path/to/file et le hook pre-commit n’exécutent pas la vérification complète des types. Utilisez bin/lint simple lorsque vous souhaitez la passe complète de vérification à l’échelle du dépôt.

Ce qui peut être corrigé automatiquement

bin/lint --fix peut corriger automatiquement de nombreux problèmes, mais pas tous.

La correction automatique est configurée pour :

  • prettier --write
  • eslint --fix
  • stylelint --fix
  • rubocop -A
  • syntax_tree (stree write)

En pratique, cela signifie que --fix peut reformater et réécrire :

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

Ces vérifications ne sont pas corrigées automatiquement par bin/lint --fix :

  • Validation de la syntaxe YAML
  • Vérification i18n pour client.en.yml / server.en.yml
  • Vérification Glint/types

Relation avec les hooks git

Le hook pre-commit utilise la même configuration lefthook que bin/lint, mais il s’exécute uniquement sur les fichiers mis en scène.

Cela signifie que :

  • un commit peut échouer si les fichiers mis en scène ne passent pas la vérification
  • bin/lint --staged est l’équivalent manuel le plus proche du hook pre-commit
  • bin/lint --fix --staged est un bon moyen de réparer exactement ce que vous êtes sur le point de commiter

Flux de travail pratique

Pour le développement quotidien, voici les commandes les plus utiles :

# Avant de commiter quelques fichiers modifiés
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# Vérifier exactement ce que le hook pre-commit va vérifier
bin/lint --staged

# Nettoyer tout le travail en cours actuel
bin/lint --fix --wip

# Exécuter la suite complète de vérification du dépôt, y compris les vérifications de types
bin/lint

Ce document est versionné - proposez des modifications sur github.

11 « J'aime »

7 messages ont été déplacés vers un nouveau sujet : Débogage du linting sur Discourse