Code automatisch vor Commits linten und formatieren

Discourse verwendet lefthook für Git-Hooks und bin/lint als Haupt-CLI-Einstiegspunkt, um dieselben Prüfungen manuell auszuführen.

Wenn du in einem lokalen Clone arbeitest, installiere die Hooks einmalig:

pnpm install
pnpm lefthook install

Danach werden gestufte Dateien bei git commit automatisch geprüft.

Der Hauptbefehl: bin/lint

Verwende bin/lint, wenn du die im Repository konfigurierten Linter selbst ausführen möchtest, anstatt auf den Pre-Commit-Hook zu warten.

Häufige Beispiele:

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

Was jeder Modus tut

  • bin/lint: Lintet alle unterstützten Dateien im Repository
  • bin/lint path/to/file ...: Lintet nur die angegebenen Dateien
  • bin/lint --recent: Lintet Dateien, die in den letzten 50 Commits geändert wurden, sowie nicht getrackte Dateien
  • bin/lint --staged: Lintet nur gestufte Dateien
  • bin/lint --unstaged: Lintet nur unggestufte Dateien
  • bin/lint --wip: Lintet gestufte Dateien, unggestufte Dateien und Dateien, die seit main geändert wurden
  • bin/lint --fix ...: Führt die Auto-Fixer für die ausgewählten Dateien aus
  • bin/lint --fix: Führt alle verfügbaren Auto-Fixer über das gesamte Repository aus
  • bin/lint --verbose: Gibt die zugrunde liegenden lefthook-Befehle aus

Wenn du explizite Dateien übergibst, filtert bin/lint diese auf unterstützte, lintbare Dateitypen, bevor es lefthook aufruft.

:information_source: Markdown-Dateien werden nur unter docs/developer-guides/ gelintet. Wenn du bin/lint path/to/doc.md für eine andere Markdown-Datei ausführst, wird gemeldet, dass nichts gelintet wurde.

Was gelintet wird

Die genaue Konfiguration befindet sich in lefthook.yml. Zum Zeitpunkt der Erstellung deckt bin/lint Folgendes ab:

Ruby

  • **/*.{rb,rake,thor}
  • Ruby-Skripte unter bin/**/*
  • Gemfile

Prüfungen:

  • rubocop
  • syntax_tree (stree check)

JavaScript-, GJS-, CSS- und SCSS-Formatierung

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • entsprechende Asset-Dateien von Plugins und Themes

Prüfungen:

  • prettier/pprettier

JavaScript- und GJS-Linting

  • frontend/**/*.{js,gjs}
  • entsprechende JS-Dateien von Plugins und Themes

Prüfungen:

  • eslint (mit den template-*-Regeln von eslint-plugin-ember, die den Template-Anteil von .gjs-Dateien abdecken)

SCSS-Linting

  • app/assets/stylesheets/**/*.scss
  • entsprechende SCSS-Dateien von Plugins und Themes

Prüfungen:

  • stylelint

YAML- und Locale-Prüfungen

  • **/*.{yaml,yml}, mit Ausnahme von config/database.yml
  • **/{client,server}.en.yml

Prüfungen:

  • yaml-lint
  • script/i18n_lint.rb

Typprüfung

Wenn du bin/lint ohne Dateiargumente ausführst, führt das vollständige Repository-Linting auch Folgendes aus:

  • pnpm lint:types

Dies ist die Glint/TypeScript-artige Prüfung für die Typinformationen von Discourse. Sie läuft im strict-Modus von TypeScript und generiert auch die veröffentlichten Deklarationen.

:information_source: bin/lint path/to/file und der Pre-Commit-Hook führen nicht die vollständige Typprüfung aus. Verwende einfaches bin/lint, wenn du den vollständigen repositoryweiten Lint-Durchlauf möchtest.

Was automatisch korrigiert werden kann

bin/lint --fix kann viele Probleme automatisch beheben, aber nicht alle.

Auto-Fix ist konfiguriert für:

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

In der Praxis bedeutet das, dass --fix neu formatieren und umschreiben kann:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

Diese Prüfungen werden durch bin/lint --fix nicht automatisch korrigiert:

  • YAML-Syntaxvalidierung
  • i18n-Linting für client.en.yml / server.en.yml
  • Glint/Typprüfung

Beziehung zu Git-Hooks

Der Pre-Commit-Hook verwendet dieselbe lefthook-Konfiguration wie bin/lint, führt sie aber nur gegen gestufte Dateien aus.

Das bedeutet:

  • Ein Commit kann fehlschlagen, weil gestufte Dateien das Linting nicht bestehen
  • bin/lint --staged ist das nächstliegende manuelle Äquivalent zum Pre-Commit-Hook
  • bin/lint --fix --staged ist ein guter Weg, genau das zu reparieren, was du gerade committen möchtest

Praktischer Workflow

Für die tägliche Entwicklung sind dies die nützlichsten Befehle:

# Vor dem Commen eines paar geänderter Dateien
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# Prüfe genau das, was der Pre-Commit-Hook prüfen würde
bin/lint --staged

# Räum alle aktuellen laufenden Arbeiten auf
bin/lint --fix --wip

# Führe den vollständigen Repository-Lint-Suite aus, einschließlich Typprüfungen
bin/lint

Dieses Dokument ist versioniert – Vorschläge für Änderungen auf GitHub.

11 „Gefällt mir“

7 Beiträge wurden in ein neues Thema aufgeteilt: Debugging linting on Discourse