Code automatisch vor Commits linten und formatieren

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

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

pnpm install
pnpm lefthook install

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

Der Hauptbefehl: bin/lint

Verwende bin/lint, wenn du die konfigurierten Linter des Repositories 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: Prüft alle unterstützten Dateien im Repository
  • bin/lint path/to/file ...: Prüft nur die angegebenen Dateien
  • bin/lint --recent: Prüft Dateien, die in den letzten 50 Commits geändert wurden, sowie nicht nachverfolgte Dateien
  • bin/lint --staged: Prüft nur gestufte Dateien
  • bin/lint --unstaged: Prüft nur nicht gestufte Dateien
  • bin/lint --wip: Prüft gestufte Dateien, nicht gestufte Dateien und Dateien, die sich seit main geändert haben
  • bin/lint --fix ...: Führt die Auto-Fixers für die ausgewählten Dateien aus
  • bin/lint --fix: Führt alle verfügbaren Auto-Fixers im gesamten Repository aus
  • bin/lint --verbose: Gibt die zugrunde liegenden lefthook-Befehle aus

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

:information_source: Markdown-Dokumentationsdateien sind derzeit nicht Teil von bin/lint, daher meldet bin/lint path/to/doc.md, dass es keine passenden Dateien zum Prüfen gibt.

Was geprüft wird

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

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-Prüfung

  • 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 der .gjs-Dateien abdecken)

SCSS-Prüfung

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

Prüfungen:

  • stylelint

YAML- und Locale-Prüfungen

  • **/*.{yaml,yml} außer 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 die Repository-weite Prüfung auch Folgendes aus:

  • pnpm lint:types

Dies ist die Glint/TypeScript-artige Prüfung für die JavaScript-Typpinformationen von Discourse.

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

Was automatisch behoben 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 Folgendes neu formatieren und umschreiben kann:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

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

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

Verhältnis zu Git-Hooks

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

Das bedeutet:

  • Ein Commit kann fehlschlagen, weil gestufte Dateien die Prüfung nicht bestehen
  • bin/lint --staged ist das nächstliegende manuelle Äquivalent zum Pre-Commit-Hook
  • bin/lint --fix --staged ist eine gute Möglichkeit, 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 Commiten einiger 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 wird
bin/lint --staged

# Räumt alle aktuellen Arbeiten in Bearbeitung auf
bin/lint --fix --wip

# Führt die vollständige Repository-Prüfungssuite 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