Ми всі використовуємо 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 hooks під капотом, тому після будь-якого оновлення конфігураційного файлу вам слід знову запустити 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-проєкту. Увага! Шлях повинен закінчуватися слешем '/'.