Discourse utilise lefthook pour les hooks git, et bin/lint comme point d’entrée principal de l’interface en ligne de commande 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
Après cela, les fichiers ajoutés à l’index (staged) 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 du dépôt, plutôt que d’attendre le hook de pré-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: linte tous les fichiers pris en charge dans le dépôtbin/lint path/to/file ...: linte uniquement les fichiers spécifiésbin/lint --recent: linte les fichiers modifiés lors des 50 derniers commits, ainsi que les fichiers non suivisbin/lint --staged: linte uniquement les fichiers ajoutés à l’indexbin/lint --unstaged: linte uniquement les fichiers non ajoutés à l’indexbin/lint --wip: linte les fichiers ajoutés à l’index, les fichiers non ajoutés à l’index et les fichiers modifiés par rapport àmainbin/lint --fix ...: exécute les correcteurs automatiques pour les fichiers sélectionnésbin/lint --fix: exécute tous les correcteurs automatiques disponibles sur l’ensemble du dépôtbin/lint --verbose: affiche les commandes lefthook sous-jacentes
Lorsque vous passez des fichiers explicites, bin/lint les filtre pour ne conserver que les types de fichiers lintables pris en charge avant d’appeler lefthook.
Les fichiers Markdown ne sont lintés que sous
docs/developer-guides/. L’exécution debin/lint path/to/doc.mdsur tout autre fichier Markdown indiquera qu’aucun fichier n’a été linté.
Ce qui est linté
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 :
rubocopsyntax_tree(stree check)
Mise en forme de JavaScript, GJS, CSS et SCSS
app/assets/stylesheets/**/*.{css,scss}frontend/**/*.{js,gjs,scss,css,cjs,mjs}- Fichiers d’actifs de plugins et de thèmes correspondants
Vérifications :
prettier/pprettier
Linting de JavaScript et GJS
frontend/**/*.{js,gjs}- Fichiers JS de plugins et de thèmes correspondants
Vérifications :
eslint(avec les règlestemplate-*deeslint-plugin-embercouvrant la partie modèle des fichiers.gjs)
Linting de SCSS
app/assets/stylesheets/**/*.scss- Fichiers SCSS de plugins et de thèmes correspondants
Vérifications :
stylelint
Vérifications YAML et de localisation
**/*.{yaml,yml}à l’exception deconfig/database.yml**/{client,server}.en.yml
Vérifications :
yaml-lintscript/i18n_lint.rb
Vérification des types
Lorsque vous exécutez bin/lint sans arguments de fichier, le lint complet du dépôt exécute également :
pnpm lint:types
C’est la vérification de type de style Glint/TypeScript pour les informations de type JavaScript de Discourse.
![]()
bin/lint path/to/fileet le hook de pré-commit n’exécutent pas la vérification de type complète. Utilisezbin/lintsimple lorsque vous souhaitez un passage de lint complet sur tout le 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 --writeeslint --fixstylelint --fixrubocop -Asyntax_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
- Linting i18n pour
client.en.yml/server.en.yml - Vérification des types Glint
Relation avec les hooks git
Le hook de pré-commit utilise la même configuration lefthook que bin/lint, mais il ne s’exécute que sur les fichiers ajoutés à l’index.
Cela signifie :
- un commit peut échouer parce que les fichiers ajoutés à l’index ne passent pas le lint
bin/lint --stagedest l’équivalent manuel le plus proche du hook de pré-commitbin/lint --fix --stagedest un bon moyen de réparer exactement ce que vous êtes sur le point de commiter
Flux de travail pratique
Pour le développement au 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 de pré-commit vérifiera
bin/lint --staged
# Nettoyer tout le travail en cours
bin/lint --fix --wip
# Exécuter la suite de lint complète du dépôt, y compris les vérifications de types
bin/lint
Ce document est sous contrôle de version - suggérez des modifications sur github.