Автоматическая проверка code style PHP

Самым популярным инструментом для анализа кода PHP является Codesniffer.

Установить его можно как глобально, так и локально. Через композер выглядит это так:

Запуск через:

Настройка Codesniffer это отдельная тема, сейчас пойдет речь про авто запуск этой команды. Чтобы не запускать каждый раз перед коммитом или пушем, можно привязать запуск на git webhooks.

Все хуки лежат в папке .git\hooks. Возьмем к примеру файл pre-commit.sample, событие вызывается до коммита. Этот хук легче всего тестировать локально, так что и другие скрипты, необходимые для других хуков, можно потренировать «на кошках»

Для начала нужно переименовать или создать новый файл с именем pre-commit.

Вставить туда вот такой код

exit 0 — программа завершено успешно, коммит принят, иначе коммит отклонен.

vendor/bin/phpcs src — при ошибке вызывает код отличный от 0

Тестируем через команду:

—allow-empty — закоммитить даже если ничего не изменено

Работает успешно, вывод терминала:

Отлично, значит этот хук смогут использовать все участники проекта?

Нет, все хуки, хранимые в папке .git/hooks являются локальными. Если разработчик создал новый хук, то работать он будет только на его локальной машине. Закоммитить его он не сможет, запушить в репозиторий тоже.

Как быть, отправлять новый хук всем по почте?

Можно, но лучше воспользоваться инструментами деплоя. Например, если в компании используется ансибль или что другое, можно добавлять хуки через него.

Но прозрачнее будет сделать это через композер.

  1. Создать файл bin/pre-commit в корне проекта
  2. Добавить в composer.json

Теперь при установке зависимостей через композер composer install файл с хуком скопируется в папку .git/hooks/pre-commit

 

Каждый раз phpcs проверяет все файлы, это слишком долго

Нужно проверять только измененные файлы.

git diff —name-only master — вернет измененные названия файлов по сравнению с мастером

Пример:

—diff-filter=MARC — вернет только M — modified, A — added, R -renamed, С — copied. CONTRIBUTING.md будет удален из списка, ведь анализатор не может проверить удаленные файлы.

grep .php$ — вернет только файлы с расширением .php

if -n  — if string is non-zero

примеры

Примеры можно скачать по ссылке https://github.com/Carsak/CodeAnalyzerExample

ОБНОВЛЕНИЕ(2024-10-09): Важно! При проверке diff допущена ошибка. При команде git diff —name-only master —diff-filter=MARC сравнивается ваша ветка с мастером И ветка мастер с вашей. То есть, если в ветке мастер есть новые коммиты, то они попадут в дифф.  Чтобы избежать этого, нужно использовать команду

которая сравнивает только вашу ветку с мастером, но не наоборот

Источник https://git-scm.com/docs/git-diff

git diff [<options>] <commit>…<commit> [—] [<path>…​]

This form is to view the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both <commit>. git diff A...B is equivalent to git diff $(git merge-base A B) B. You can omit any one of <commit>, which has the same effect as using HEAD instead.

2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *