Мы все используем PHP Code Style Fixer. Мы все его любим! Но нам не нравится каждый раз перед отправкой изменений нажимать кнопку «composer fix». Обещаю, вам понравится утилита Lefthook, потому что она автоматизирует одно из самых частых действий в PHP-проектах.
Рано или поздно каждый разработчик в своей жизни узнает радость автоматических инструментов исправления кода. Это экономит нам время и улучшает качество кода. Однако со временем каждый разработчик сталкивается с проблемой автоматизации таких процессов. Нам не нравится вручную запускать процессы исправления кода, тратя наше время и фокус на таких базовых вещах.
Я пробовал различные инструменты. От прямых коммитов в директорию .git/hooks
до Husky. Я искал идеальное решение для автоматизации исправления кода в своих проектах. Одним из самых популярных инструментов для таких целей является Husky.
Сложная настройка. Конфигурация Husky проходит через слишком много шагов и не имеет богатых функций "из коробки" для упрощения настройки.
Среда Node.js. Такой простой инструмент требует установки NodeJS. Это вызывает нагрузку на производительность во время установки и использования.
Управление зависимостями. Для установки Husky вам понадобится один из менеджеров пакетов NPM/PNPM/Bun. Любой из них засоряет ваш компьютер ненужными вещами и усложняет настройку инструмента.
Просматривая список репозиториев на GitHub, я обнаружил универсальный инструмент для разработчиков под названием Lefthook. Итак, почему он мне понравился?
Использование компилируемого языка
Отличная производительность
Не требуются пакетные менеджеры или среда выполнения
Может быть интегрирован в любую среду без проблем
Поставляется как единый бинарный файл
Использование синтаксиса YAML для конфигурационных файлов. YAML — хорошо известная разметка для конфигурационных файлов в CI-процессах для большинства проектов, например, GitHub Actions. Он используется в большинстве проектов с открытым исходным кодом.
Большинство настроек можно сконфигурировать с помощью встроенных утилит. Lefthook имеет богатый набор опций конфигурации. Нет необходимости знать внутренности git для настройки таких базовых задач, как автоматическое исправление кода или линтинг кода.
Отличная поддержка монорепозиториев
Слишком много введения для такого короткого действия. На момент написания этой статьи последняя версия Lefthook — 1.6.4. Давайте перейдем к шагам.
Установите и настройте PHP Code Style Fixer, как описано в их Readme.
Установите Lefthook любым удобным способом из руководства по установке. На macOS я делаю это через пакетный менеджер brew: brew install lefthook
.
Создайте конфигурационный файл с именем lefthook.yml
в корне вашего проекта. Внимание! Он должен быть расположен в корне git-репозитория, даже если вы используете монорепозиторий.
Вставьте следующее содержимое в файл lefthook.yml
.
pre-commit:
commands:
web-cs-fixer:
tags: style fixer
glob: "*.php"
stage_fixed: true
run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}
Выполните команду lefthook install
, чтобы применить изменения. Внимание! Lefthook использует git-хуки под капотом, поэтому после любого обновления конфигурационного файла вам следует снова запустить lefthook install
.
Вот и все. Приятного кодинга!
Шаблон {staged_files}
— встроенная переменная, используемая для предоставления списка измененных файлов.
Свойство glob
используется для фильтрации файлов, на которых вы хотите выполнить команду.
*.php
означает, что PHP CS Fixer будет запускаться только на файлах с расширением php, избегая конфликтов с другими расширениями.stage_fixed
— моя любимая часть. Она заботится о добавлении измененных файлов обратно в git (нет необходимости выполнять команду git add
).
run
содержит команду, которую вы хотите выполнить перед каждым коммитом.
В одном из моих проектов я использую дизайн монорепозитория с Docker. Один из контейнеров — это PHP Symfony приложение. Есть простое решение для такого случая.
Чтобы запустить PHP CS Fixer в монорепозитории, в конфигурации есть свойство root. Обновите ваш lefthook.yml
в корне проекта следующим образом.
pre-commit:
commands:
web-cs-fixer:
tags: style fixer
root: "path/to/docker_containers/php_web_app/"
glob: "*.php"
stage_fixed: true
run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}
Замените path/to/docker_containers/php_web_app/
на путь к вашей директории php-проекта. Внимание! Путь должен оканчиваться косой чертой '/'.