Автоматическая проверка и форматирование кода перед коммитами

Discourse использует lefthook для git-хуков, а bin/lint — как основную точку входа CLI для ручного запуска тех же проверок.

Если вы работаете в локальном клоне, установите хуки один раз:

pnpm install
pnpm lefthook install

После этого закоммиченные файлы будут автоматически проверяться при выполнении git commit.

Основная команда: bin/lint

Используйте bin/lint, если хотите запустить настроенные линтеры репозитория самостоятельно, не дожидаясь срабатывания pre-commit хука.

Частые примеры:

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

Что делает каждый режим

  • bin/lint: проверка всех поддерживаемых файлов в репозитории
  • bin/lint path/to/file ...: проверка только указанных файлов
  • bin/lint --recent: проверка файлов, изменённых в последних 50 коммитах, плюс неотслеживаемые файлы
  • bin/lint --staged: проверка только закоммиченных файлов
  • bin/lint --unstaged: проверка только незакоммиченных файлов
  • bin/lint --wip: проверка закоммиченных файлов, незакоммиченных файлов и файлов, изменённых с момента main
  • bin/lint --fix ...: запуск автоисправлений для выбранных файлов
  • bin/lint --fix: запуск всех доступных автоисправлений по всему репозиторию
  • bin/lint --verbose: вывод соответствующих команд lefthook

При передаче явных имён файлов bin/lint фильтрует их по поддерживаемым типам файлов перед вызовом lefthook.

:information_source: Файлы документации в формате Markdown в настоящее время не входят в bin/lint, поэтому запуск bin/lint path/to/doc.md сообщит, что нет подходящих файлов для проверки.

Что проверяется

Точная конфигурация находится в lefthook.yml. На момент написания bin/lint охватывает:

Ruby

  • **/*.{rb,rake,thor}
  • Ruby-скрипты в bin/**/*
  • Gemfile

Проверки:

  • rubocop
  • syntax_tree (stree check)

Форматирование JavaScript, GJS, CSS и SCSS

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • соответствующие файлы ассетов плагинов и тем

Проверки:

  • prettier/pprettier

Линтинг JavaScript и GJS

  • frontend/**/*.{js,gjs}
  • соответствующие JS-файлы плагинов и тем

Проверки:

  • eslint (с правилами template-* плагина eslint-plugin-ember, покрывающими шаблонную часть файлов .gjs)

Линтинг SCSS

  • app/assets/stylesheets/**/*.scss
  • соответствующие SCSS-файлы плагинов и тем

Проверки:

  • stylelint

Проверки YAML и локализации

  • **/*.{yaml,yml}, кроме config/database.yml
  • **/{client,server}.en.yml

Проверки:

  • yaml-lint
  • script/i18n_lint.rb

Проверка типов

При запуске bin/lint без аргументов файлов также выполняется полная проверка репозитория:

  • pnpm lint:types

Это проверка в стиле Glint/TypeScript для информации о типах JavaScript в Discourse.

:information_source: bin/lint path/to/file и pre-commit хук не выполняют полную проверку типов. Используйте обычную команду bin/lint, если хотите выполнить полную проверку репозитория.

Что может быть автоматически исправлено

bin/lint --fix может автоматически исправить множество проблем, но не все.

Автоисправление настроено для:

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

На практике это означает, что --fix может переформатировать и переписать:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

Эти проверки не исправляются автоматически через bin/lint --fix:

  • валидация синтаксиса YAML
  • линтинг i18n для client.en.yml / server.en.yml
  • проверка Glint/типов

Взаимосвязь с git-хуками

Pre-commit хук использует ту же конфигурацию lefthook, что и bin/lint, но работает только с закоммиченными файлами.

Это означает:

  • коммит может быть отклонён, если закоммиченные файлы не проходят линтинг
  • bin/lint --staged — это наиболее близкий ручной аналог pre-commit хука
  • bin/lint --fix --staged — хороший способ исправить именно то, что вы собираетесь закоммитить

Практический рабочий процесс

Для повседневной разработки наиболее полезны следующие команды:

# Перед коммитом нескольких изменённых файлов
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# Проверить именно то, что проверит pre-commit хук
bin/lint --staged

# Очистить всю текущую работу в процессе
bin/lint --fix --wip

# Запустить полный набор линтеров репозитория, включая проверку типов
bin/lint

Этот документ находится под контролем версий — предлагайте изменения на GitHub.

11 лайков

7 сообщений были перенесены в новую тему: Отладка линтинга в Discourse