Автоматизация рабочего процесса PHP CS Fixer для коммитов Git

Мы все используем PHP Code Style Fixer. Мы все его любим! Но нам не нравится каждый раз перед отправкой изменений нажимать кнопку «composer fix». Обещаю, вам понравится утилита Lefthook, потому что она автоматизирует одно из самых частых действий в PHP-проектах.

PHP CS fixer visualisation
Уявлення PHP CS Fixer у поєднанні з LeftHook з точки зору ШІ

Рано или поздно каждый разработчик в своей жизни узнает радость автоматических инструментов исправления кода. Это экономит нам время и улучшает качество кода. Однако со временем каждый разработчик сталкивается с проблемой автоматизации таких процессов. Нам не нравится вручную запускать процессы исправления кода, тратя наше время и фокус на таких базовых вещах.

Мое путешествие

Я пробовал различные инструменты. От прямых коммитов в директорию .git/hooks до Husky. Я искал идеальное решение для автоматизации исправления кода в своих проектах. Одним из самых популярных инструментов для таких целей является Husky.

Почему мне не нравится Husky?

  • Сложная настройка. Конфигурация Husky проходит через слишком много шагов и не имеет богатых функций "из коробки" для упрощения настройки.

  • Среда Node.js. Такой простой инструмент требует установки NodeJS. Это вызывает нагрузку на производительность во время установки и использования.

  • Управление зависимостями. Для установки Husky вам понадобится один из менеджеров пакетов NPM/PNPM/Bun. Любой из них засоряет ваш компьютер ненужными вещами и усложняет настройку инструмента.

Я нашел идеальное решение для себя

Просматривая список репозиториев на GitHub, я обнаружил универсальный инструмент для разработчиков под названием Lefthook. Итак, почему он мне понравился?

  • Использование компилируемого языка

    • Отличная производительность

    • Не требуются пакетные менеджеры или среда выполнения

    • Может быть интегрирован в любую среду без проблем

    • Поставляется как единый бинарный файл

  • Использование синтаксиса YAML для конфигурационных файлов. YAML — хорошо известная разметка для конфигурационных файлов в CI-процессах для большинства проектов, например, GitHub Actions. Он используется в большинстве проектов с открытым исходным кодом.

  • Большинство настроек можно сконфигурировать с помощью встроенных утилит. Lefthook имеет богатый набор опций конфигурации. Нет необходимости знать внутренности git для настройки таких базовых задач, как автоматическое исправление кода или линтинг кода.

  • Отличная поддержка монорепозиториев

Конфигурация Lefthook с PHP CS Fixer

Слишком много введения для такого короткого действия. На момент написания этой статьи последняя версия Lefthook1.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-проекта. Внимание! Путь должен оканчиваться косой чертой '/'.