Code vor Commits automatisch linten und formatieren

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

Wenn Sie in einer lokalen Kopie arbeiten, installieren Sie die Hooks einmal:

pnpm install
pnpm lefthook install

Danach werden die gestagten Dateien automatisch bei git commit geprüft.

Der Hauptbefehl: bin/lint

Verwenden Sie bin/lint, wenn Sie die für das Repository konfigurierten Linter selbst ausführen möchten, anstatt auf den Pre-Commit-Hook zu warten.

Häufige Beispiele:

bin/lint
bin/lint pfad/zu/datei.rb pfad/zu/datei.gjs
bin/lint --recent
bin/lint --staged
bin/lint --unstaged
bin/lint --wip
bin/lint --fix pfad/zu/datei.rb
bin/lint --fix --recent
bin/lint --fix

Was die einzelnen Modi bewirken

  • bin/lint: Lintet alle unterstützten Dateien im Repository
  • bin/lint pfad/zu/datei ...: Lintet nur die angegebenen Dateien
  • bin/lint --recent: Lintet Dateien, die in den letzten 50 Commits geändert wurden, zuzüglich nicht verfolgter Dateien
  • bin/lint --staged: Lintet nur gestagte Dateien
  • bin/lint --unstaged: Lintet nur nicht gestagte Dateien
  • bin/lint --wip: Lintet gestagte Dateien, nicht gestagte Dateien und Dateien, die seit main geändert wurden
  • bin/lint --fix ...: Führt die automatischen Korrekturen für die ausgewählten Dateien aus
  • bin/lint --fix: Führt alle verfügbaren automatischen Korrekturen im gesamten Repository aus
  • bin/lint --verbose: Gibt die zugrunde liegenden lefthook-Befehle aus

Wenn Sie explizite Dateien übergeben, filtert bin/lint diese auf unterstützte lintbare Dateitypen, bevor lefthook aufgerufen wird.

:information_source: Markdown-Dokumentationsdateien sind derzeit nicht Teil von bin/lint. Daher meldet die Ausführung von bin/lint pfad/zu/doc.md, dass keine übereinstimmenden Dateien zum Linting gefunden wurden.

Was wird gelintet

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}
  • passende Plugin- und Theme-Asset-Dateien

Prüfungen:

  • prettier/pprettier

JavaScript und GJS Linting

  • frontend/**/*.{js,gjs}
  • passende Plugin- und Theme-JS-Dateien

Prüfungen:

  • eslint

GJS Template Linting

  • frontend/**/*.gjs
  • passende Plugin- und Theme-.gjs-Dateien

Prüfungen:

  • ember-template-lint

SCSS Linting

  • app/assets/stylesheets/**/*.scss
  • passende Plugin- und Theme-SCSS-Dateien

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

Typ-Prüfung

Wenn Sie bin/lint ohne Dateinamen-Argumente ausführen, wird auch das vollständige Repository-Lint ausgeführt:

  • pnpm lint:types

Dies ist die Glint/TypeScript-ähnliche Prüfung für Discurses JavaScript-Typinformationen.

:information_source: bin/lint pfad/zu/datei und der Pre-Commit-Hook führen die vollständige Typenprüfung nicht aus. Verwenden Sie einfach bin/lint, wenn Sie den vollständigen, repositoryweiten Lint-Durchlauf wünschen.

Was kann automatisch korrigiert werden

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

Die automatische Korrektur ist konfiguriert für:

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

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

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

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

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

Beziehung zu Git Hooks

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

Das bedeutet:

  • Ein Commit kann fehlschlagen, weil gestagte Dateien das Linting nicht bestehen
  • bin/lint --staged ist das nächstgelegene manuelle Äquivalent zum Pre-Commit-Hook
  • bin/lint --fix --staged ist eine gute Möglichkeit, genau das zu reparieren, was Sie gerade committen wollen

Praktischer Workflow

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

# Bevor Sie ein paar geänderte Dateien committen
bin/lint --fix pfad/zu/datei1.rb pfad/zu/datei2.gjs

# Prüfen Sie genau das, was der Pre-Commit-Hook prüfen wird
bin/lint --staged

# Bereinigen Sie alle aktuellen, in Arbeit befindlichen Änderungen
bin/lint --fix --wip

# Führen Sie die vollständige Repository-Lint-Suite aus, einschließlich Typenprüfungen
bin/lint

Dieses Dokument ist versioniert – schlagen Sie Änderungen auf github vor.

11 „Gefällt mir“

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