Настройка автоматического форматирования при коммите
Споры о стиле кода в PR — трата времени ревьюеров. Автоматическое форматирование при коммите убирает эту проблему: код всегда соответствует стандарту, независимо от настроек редактора разработчика.
Инструменты форматирования
JavaScript / TypeScript — Prettier для форматирования, ESLint для линтинга. Они решают разные задачи: Prettier контролирует внешний вид (отступы, кавычки, точки с запятой), ESLint — качество кода (неиспользуемые переменные, потенциальные баги).
Python — Black для форматирования (zero-config), isort для сортировки импортов, Ruff как быстрая замена обоим.
PHP — PHP CS Fixer или Pint (Laravel-first, основан на CS Fixer).
Go — gofmt встроен в язык, goimports добавляет управление импортами.
Husky + lint-staged: стандарт для Node.js проектов
npm install --save-dev husky lint-staged
npx husky init
.husky/pre-commit:
#!/bin/sh
npx lint-staged
package.json:
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{css,scss,md,json,yaml}": [
"prettier --write"
],
"*.php": [
"./vendor/bin/pint"
]
}
}
lint-staged обрабатывает только staged файлы — не форматирует весь проект при каждом коммите. Это критически важно для скорости.
pre-commit framework: универсальное решение
Для смешанных проектов или Python-экосистемы — pre-commit:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-merge-conflict
- repo: https://github.com/psf/black
rev: 24.3.0
hooks:
- id: black
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.0
hooks:
- id: ruff
args: [--fix]
pip install pre-commit
pre-commit install # Устанавливает хуки в .git/hooks
Конфигурация Prettier
// .prettierrc
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100,
"arrowParens": "always"
}
.prettierignore:
dist/
build/
node_modules/
*.min.js
Синхронизация с CI
Хуки на локальной машине легко обойти через --no-verify. В CI добавляем отдельную проверку:
- name: Check formatting
run: npx prettier --check .
- name: Check lint
run: npx eslint .
CI не форматирует автоматически — только проверяет и падает при нарушениях. Это мотивирует разработчиков не обходить локальные хуки.
Сроки
Настройка Husky + lint-staged + Prettier + ESLint для JavaScript/TypeScript проекта — 2–4 часа. Настройка pre-commit для Python или PHP — 2–4 часа. Интеграция проверок в GitHub Actions CI — 1–2 часа.







