PHP codeniffer (phpcs) - как разрешить переопределение при использовании как части хука предварительной фиксации svn?

У нас есть веб-приложение PHP 5, и в настоящее время мы оцениваем PHP CodeSniffer, чтобы решить, улучшают ли принудительные стандарты кода качество кода.

Мы используем subversion для нашего репозитория кода и базы развертывания, и я добавил SVN перехватчик предварительной фиксации, чтобы убедиться, что все зафиксированные файлы не имеют стандартных запахов кодирования. Хук технически работает, но вызывает слишком много головной боли, чтобы быть действительно полезным:

  1. Если нам нужно исправить экстренную ошибку, которая вызывает перебои в работе сайта, последнее, что нам нужно, — это отказ от коммита из-за какой-то незначительной проблемы с пробелами.
  2. У нас есть МНОГО устаревшего кода, который иногда содержит сотни ошибок phpcs — нецелесообразно исправлять все ошибки phpcs в этих файлах прямо сейчас. Одним из примеров является файл, полный функций, которые не имеют комментариев. Другой пример: если имя класса начинается с буквы нижнего регистра, выдается ошибка, но исправление этого может потребовать изменения 10, 20+ файлов, которые необходимо будет зафиксировать, которые затем будут сниффаться, рекурсивно...
  3. У нас есть несколько файлов, которые немного велики (например, 4000 строк кода?), и phpcs проверяет их несколько минут. Задержка коммита на такой срок недопустима.
  4. Я еще не тестировал это, но я полагаю, что если вы сделаете ветку svn и зафиксируете ее, phpcs проверит все и займет очень много времени, чтобы проверить все 1000 файлов?

Учитывая, что сегодня мы не можем реорганизовать всю нашу кодовую базу. Кто-нибудь знает, как я могу использовать параметр фиксации svn, который сообщит обработчику svn pre-commit не запускать phpcs?

А может быть есть другой способ снять описанные головные боли?


person Tom    schedule 30.07.2010    source источник


Ответы (3)


Зачем запускать его на предварительной фиксации? Я использовал как PHPUnderControl, так и Hudson для автоматизации "сборки" php... По сути, они запускают скрипт сборки ant/phing, который запускает автоматизированные тесты (PHPUnit) и сканеры качества кода (включая PHPCS) после каждого коммита (определяется автоматически). Таким образом, он не отклонит фиксацию, но отправит приятное электронное письмо тому, кому вы хотите, о том, что сборка не удалась, и укажет, почему (конкретные строки оскорбительного кода)...

person ircmaxell    schedule 30.07.2010
comment
Спасибо за ответ. Хорошая идея, я рассмотрю непрерывную интеграцию... Я никогда не думал, что это может быть полезно для некомпилируемого языка. - person Tom; 30.07.2010
comment
Я нахожу это ОЧЕНЬ полезным. Тем более, что мы начали тестировать Selenium. По сути, он настроен на запуск всего цикла тестирования/сборки/документации при каждом коммите, и если он проходит, он упаковывает и отправляет на центральный сервер. Таким образом, на этом сервере всегда будет самая последняя сборка (включая документацию и т. д.). Это значительно упрощает управление и взаимодействие с командой при использовании любой методологии Agile... - person ircmaxell; 30.07.2010

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

Во-первых, у нас есть политика «распростертых объятий» при фиксации:

  • Весь код, работающий или нет, соответствующий или нет, принимается: до тех пор, пока его сообщение журнала фиксации имеет идентификатор отслеживания ошибок (проверка хука перед фиксацией)
  • Поощряет частые коммиты и его преимущества: совместная работа, отмена, резервное копирование.

Затем у нас есть политика «сжатого кулака» в отношении промежуточных/выпускных сборок:

  • Сборка завершается сбоем при любом, даже тривиальном, отклонении от правил, что означает: обязательную корректность синтаксиса, соответствие стандартам, документацию кода и все тесты проходят с честью
  • Предотвращает выпуск чего-либо глючного. Если что-то глючит, это проблема с кодом И проблема со сборкой (дыра в процессе, недостаточно тестов и т. д.)

Все это автоматизируется через phing с использованием phpcs (и, конечно же, phpunit, phpdocumentor и т. д.).

person bishop    schedule 29.09.2010

Я думаю, что ircmaxell имеет отличную точку зрения - такого рода проверка стандартов должна быть где-то еще, кроме хука перед фиксацией, например. в среде непрерывной интеграции или, в крайнем случае, перехватчик после фиксации и должен быть основан на предоставлении информации, а не на блокировании коммитов!

Имея это в виду, я решил на данный момент использовать подход opt-in. Я настроил хук pre-commit svn, чтобы искать ключевое слово в сообщении фиксации и запускать phpcs, если оно было найдено.

В скрипте ловушки перед фиксацией, например. /var/www/svn/repos/<reponame>/hooks/;

#!/bin/sh

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/bin/scripts/phpcs-svn-pre-commit

if [[ `$SVNLOOK log -t $TXN $REPOS | tr "[:upper:]" "[:lower:]"` =~ "\[?standardcode\]?" ]]; then

  # Run the PHP code sniffer                                                                                                                     
  PHPCS_STRICT=`$PHPCS "$REPOS" -t "$TXN"`
  if [[ $? -ne 0 ]]; then
      echo "$PHPCS_STRICT" >>/dev/stderr
      echo "*** Commit blocked - Please fix coding standard errors." >>/dev/stderr
      exit 1
  fi
fi

exit 0

Примечания:

  • Я выбрал ключевое слово [standardcode], а сообщение журнала было преобразовано в нижний регистр, чтобы сделать ключевое слово нечувствительным к регистру.
  • Хук фиксации phpcs (/usr/bin/scripts/phpcs-svn-pre-commit) поставляется вместе с phpcs (по крайней мере, в CentOS 5.5).

Идея состоит в том, что разработчик может поместить ключевое слово в сообщение о коммите в качестве своего рода почетного знака, но он не обязан проверять свой код, если он не подходит для его коммита.

person Tom    schedule 31.07.2010
comment
Разве это не противоречит цели наличия сниффера? Он предназначен для обеспечения соблюдения стиля, а не просто для проверки его по запросу. Кроме того, более поздняя фиксация потерпит неудачу при предыдущей фиксации, если предыдущая была обойдена... - person ircmaxell; 31.07.2010
comment
@ircmaxell - да, это так. Наш процесс разработки развивается, я хочу начать с маленьких шажков в правильном направлении и вовремя улучшать его. - person Tom; 02.08.2010
comment
Что ж, вполне справедливо. Удачи! - person ircmaxell; 02.08.2010