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

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

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

pnpm install
pnpm lefthook install

После этого файлы в индексе (staged files) будут автоматически проверяться при выполнении 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: проверяет только файлы в индексе (staged)
  • bin/lint --unstaged: проверяет только файлы вне индекса (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, но работает только с файлами в индексе (staged).

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

  • коммит может завершиться ошибкой, если файлы в индексе не проходят линтинг
  • 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