Lint e formatta automaticamente il codice prima dei commit

Discourse utilizza lefthook per gli hook di git e bin/lint come punto di ingresso principale della CLI per eseguire manualmente gli stessi controlli.

Se stai lavorando su una copia locale, installa gli hook una sola volta:

pnpm install
pnpm lefthook install

Da quel momento, i file in staging verranno controllati automaticamente al comando git commit.

Il comando principale: bin/lint

Usa bin/lint quando vuoi eseguire manualmente i linter configurati nel repository invece di attendere l’hook pre-commit.

Esempi comuni:

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

Cosa fa ciascuna modalità

  • bin/lint: esegue il lint su tutti i file supportati nel repository
  • bin/lint path/to/file ...: esegue il lint solo sui file specificati
  • bin/lint --recent: esegue il lint sui file modificati negli ultimi 50 commit, più i file non tracciati
  • bin/lint --staged: esegue il lint solo sui file in staging
  • bin/lint --unstaged: esegue il lint solo sui file non in staging
  • bin/lint --wip: esegue il lint sui file in staging, non in staging e modificati da main
  • bin/lint --fix ...: esegue gli auto-fix sui file selezionati
  • bin/lint --fix: esegue tutti gli auto-fix disponibili nell’intero repository
  • bin/lint --verbose: stampa i comandi sottostanti di lefthook

Quando passi file espliciti, bin/lint li filtra per includere solo i tipi di file supportati prima di invocare lefthook.

:information_source: I file di documentazione Markdown non sono attualmente inclusi in bin/lint, quindi eseguire bin/lint path/to/doc.md restituirà un messaggio che indica che non ci sono file corrispondenti da sottoporre a lint.

Cosa viene sottoposto a lint

La configurazione esatta si trova in lefthook.yml. Al momento della stesura, bin/lint copre:

Ruby

  • **/*.{rb,rake,thor}
  • Script Ruby sotto bin/**/*
  • Gemfile

Controlli:

  • rubocop
  • syntax_tree (stree check)

Formattazione JavaScript, GJS, CSS e SCSS

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • File asset corrispondenti di plugin e temi

Controlli:

  • prettier/pprettier

Linting di JavaScript e GJS

  • frontend/**/*.{js,gjs}
  • File JS corrispondenti di plugin e temi

Controlli:

  • eslint (con le regole template-* di eslint-plugin-ember che coprono la parte di template dei file .gjs)

Linting di SCSS

  • app/assets/stylesheets/**/*.scss
  • File SCSS corrispondenti di plugin e temi

Controlli:

  • stylelint

Controlli YAML e locale

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

Controlli:

  • yaml-lint
  • script/i18n_lint.rb

Controllo dei tipi

Quando esegui bin/lint senza argomenti di file, il lint completo del repository esegue anche:

  • pnpm lint:types

Questo è il controllo stile Glint/TypeScript per le informazioni sui tipi JavaScript di Discourse.

:information_source: bin/lint path/to/file e l’hook pre-commit non eseguono il controllo completo dei tipi. Usa bin/lint senza argomenti quando vuoi eseguire il lint completo su tutto il repository.

Cosa può essere corretto automaticamente

bin/lint --fix può correggere automaticamente molti problemi, ma non tutti.

L’auto-correzione è configurata per:

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

In pratica, questo significa che --fix può riformattare e riscrivere:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

Questi controlli non vengono corretti automaticamente da bin/lint --fix:

  • Validazione della sintassi YAML
  • Linting i18n per client.en.yml / server.en.yml
  • Controllo Glint/di tipo

Relazione con gli hook git

L’hook pre-commit utilizza la stessa configurazione di lefthook di bin/lint, ma viene eseguito solo sui file in staging.

Questo significa che:

  • un commit può fallire perché i file in staging non superano il linting
  • bin/lint --staged è l’equivalente manuale più vicino all’hook pre-commit
  • bin/lint --fix --staged è un buon modo per riparare esattamente ciò che stai per commitare

Flusso di lavoro pratico

Per lo sviluppo quotidiano, questi sono i comandi più utili:

# Prima di commitare alcuni file modificati
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# Controlla esattamente cosa controllerà l'hook pre-commit
bin/lint --staged

# Pulisci tutto il lavoro in corso
bin/lint --fix --wip

# Esegui la suite completa di lint del repository, inclusi i controlli dei tipi
bin/lint

Questo documento è sottoposto a controllo versione: suggerisci modifiche su github.

11 Mi Piace

7 messaggi sono stati suddivisi in un nuovo argomento: Debugging linting on Discourse