O Discourse usa o lefthook para git hooks e bin/lint como o ponto de entrada principal da CLI para executar as mesmas verificações manualmente.
Se você estiver trabalhando em um clone local, instale os hooks uma vez:
pnpm install
pnpm lefthook install
Depois disso, os arquivos em staging serão verificados automaticamente no git commit.
O comando principal: bin/lint
Use bin/lint quando quiser executar os linters configurados do repositório você mesmo, em vez de esperar pelo hook pre-commit.
Exemplos comuns:
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
O que cada modo faz
bin/lint: faz o lint de todos os arquivos suportados no repositóriobin/lint path/to/file ...: faz o lint apenas dos arquivos fornecidosbin/lint --recent: faz o lint dos arquivos alterados nos últimos 50 commits, além dos arquivos não rastreadosbin/lint --staged: faz o lint apenas dos arquivos em stagingbin/lint --unstaged: faz o lint apenas dos arquivos fora do stagingbin/lint --wip: faz o lint dos arquivos em staging, dos arquivos fora do staging e dos arquivos alterados desde omainbin/lint --fix ...: executa os corretores automáticos para os arquivos selecionadosbin/lint --fix: executa todos os corretores automáticos disponíveis em todo o repositóriobin/lint --verbose: imprime os comandos subjacentes do lefthook
Quando você passa arquivos explícitos, o bin/lint os filtra para os tipos de arquivos lintáveis suportados antes de invocar o lefthook.
Os arquivos de documentação em Markdown não fazem parte do
bin/lintno momento, portanto, executarbin/lint path/to/doc.mdreportará que não há arquivos correspondentes para lint.
O que é verificado
A configuração exata está em lefthook.yml. No momento da escrita, o bin/lint cobre:
Ruby
**/*.{rb,rake,thor}- Scripts Ruby sob
bin/**/* Gemfile
Verificações:
rubocopsyntax_tree(stree check)
Formatação de JavaScript, GJS, CSS e SCSS
app/assets/stylesheets/**/*.{css,scss}frontend/**/*.{js,gjs,scss,css,cjs,mjs}- Arquivos de assets de plugins e temas correspondentes
Verificações:
prettier/pprettier
Linting de JavaScript e GJS
frontend/**/*.{js,gjs}- Arquivos JS de plugins e temas correspondentes
Verificações:
eslint(com as regrastemplate-*doeslint-plugin-embercobrindo a parte de template dos arquivos.gjs)
Linting de SCSS
app/assets/stylesheets/**/*.scss- Arquivos SCSS de plugins e temas correspondentes
Verificações:
stylelint
Verificações de YAML e localização
**/*.{yaml,yml}, excetoconfig/database.yml**/{client,server}.en.yml
Verificações:
yaml-lintscript/i18n_lint.rb
Verificação de tipos
Quando você executa bin/lint sem argumentos de arquivo, o lint completo do repositório também executa:
pnpm lint:types
Esta é a verificação no estilo Glint/TypeScript para as informações de tipo JavaScript do Discourse.
![]()
bin/lint path/to/filee o hook pre-commit não executam a verificação completa de tipos. Use obin/lintsimples quando quiser a passagem completa de lint em todo o repositório.
O que pode ser corrigido automaticamente
bin/lint --fix pode corrigir automaticamente muitos problemas, mas nem todos.
A correção automática está configurada para:
prettier --writeeslint --fixstylelint --fixrubocop -Asyntax_tree(stree write)
Na prática, isso significa que --fix pode reformatar e reescrever:
- Ruby
- JavaScript / GJS
- CSS / SCSS
Estas verificações não são corrigidas automaticamente pelo bin/lint --fix:
- Validação de sintaxe YAML
- Linting de i18n para
client.en.yml/server.en.yml - Verificação de tipos Glint
Relação com os git hooks
O hook pre-commit usa a mesma configuração do lefthook que o bin/lint, mas ele é executado apenas contra os arquivos em staging.
Isso significa que:
- um commit pode falhar porque os arquivos em staging não passam no lint
bin/lint --stagedé o equivalente manual mais próximo do hook pre-commitbin/lint --fix --stagedé uma boa maneira de reparar exatamente o que você está prestes a commitar
Fluxo de trabalho prático
Para o desenvolvimento do dia a dia, estes são os comandos mais úteis:
# Antes de commitar alguns arquivos alterados
bin/lint --fix path/to/file1.rb path/to/file2.gjs
# Verificar exatamente o que o hook pre-commit verificará
bin/lint --staged
# Limpar todo o trabalho atual em andamento
bin/lint --fix --wip
# Executar a suíte completa de lint do repositório, incluindo verificações de tipos
bin/lint
Este documento é controlado por versão - sugira alterações no github.