pre-commit
Я и моя команда столкнулись с проблемой, когда нарушения соглашений по Code Style стали выявляться достаточно поздно: в
CI или на Code Review. Общей настройки .editorconfig
нам было явно недостаточно, так как сам по себе editorconfig
не
может описать полностью все нюансы форматирования.
Очевидным и общеизвестным решением здесь является проверка кода до передачи в систему контроля версий. Все прекрасно
знают о хуках в git
, однако за последние несколько лет не встречал команд, которые активно бы их использовали.
На мой взгляд, есть две основные проблемы с хуками в git
:
- Невозможность их прозрачной установки при получении рабочей копии.
- Запуск сценария в ответ на определенное действие (например,
pre-commit
) производится только одним файлом в каталоге.git/hooks
— это усложняет поддержание хуков в актуальном состоянии всеми участниками команды.
Чтобы облегчить настройку pre-commit
-хука мы использовали известный инструмент pre-commit
. Он написан на python
и
использует конфигурацию в yaml
-формате.
В чём преимущества этого инструмента? Давайте их перечислим:
- Декларативное описание сценариев в едином конфигурационном файле
.pre-commit-config.yaml
, которые необходимо выполнить до того, как изменения в кодовой базе попадут в историю. - Строгая фиксация версий самих сценариев — это ключ к воспроизводимости у всех участников на всех машинах.
- Возможность запустить весь набор сценариев проверки отдельно от
git
с помощью командыpre-commit run
. - Простая установка сценариев одной командой
pre-commit install
для вашей рабочей копии.
Установка
Я рекомендую устанавливать pre-commit
с помощью утилиты pipx
. У этого способа есть неоспоримое преимущество: для
каждого инструмента, установленного с помощью pipx
создаётся свой собственный virtualenv
, и пакеты python
, от
которых зависит этот инструмент, не будут конфликтовать друг с другом в системном site-packages
.
pipx install pre-commit
Если для вас это не играет большой роли, можете воспользоваться инструкцией по установке из официальной документации.
Пример
Вот как выглядит файл .pre-commit-config.yaml
для этого блога:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-toml
- repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.34.0
hooks:
- id: markdownlint-docker
args:
- --disable
- MD034
Я намеренно отключил инспекцию, запрещающую использовать “голые” ссылки в markdown
— считаю это допустимым.
А вот так, например, можно включить проверку и форматирование директивы import
в языке Go
с помощью
инструмента goimports
:
repos:
- repo: https://github.com/tekwizely/pre-commit-golang
rev: 645165368711be670d1945c15060e746f5ed15c6
hooks:
- id: go-imports
args:
- -local
- git.your-company.tld
- -w
Описав конфигурационный файл .pre-commit-config.yaml
в корне вашего репозитория выполните команду:
pre-commit install
Она добавит запуск хуков в вашей рабочей копии.
Если вы хотите проверить ваши изменения до запуска команды git commit
, запустите pre-commit run
:
pre-commit run
Вывод покажет проблемы, если они имеются.
Надеюсь, с помощью инструмента pre-commit
вам будет проще начать использовать хуки git
, если, конечно, у вас есть
такая потребность. Успехов!