CodeSniffer и PhpEd

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

    Исторически сложилось, что в работе я использую IDE от Nusphere – PhpEd. PhpEd позволяет подключать к себе скрипты на php, которые могут выполнять произвольные операции над кодом в редакторе. Скрипт также может запустить внешнюю программу и вернуть данные со стандартного потока вывода непосредственно в редактор кода.

    На форуме Nusphere есть целый раздел, посвященный скриптам автоматизации

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

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

    File location regexp: ^([^ ]+) (\([0-9]*\)) .*$
    (or say Output location regexp)
    by applying this regexp on each line in the output, IDE will get array of two elements (when matched, of course). And one of the elements will be file name and the other is line number.


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

    Теперь все по шагам:

    0. Устанавливаем pear для php, который идет в составе PhpEd
    c:\Program Files\NuSphere\PhpED\php5> go-pear.bat

    и пакет php_sniffer
    c:\Program Files\NuSphere\PhpED\php5> pear install php_sniffer

    1. Качаем мой небольшой класс-обертку над CodeSniffer. Кладем его, скажем, в
    c:\Program Files\NuSphere\PhpED\scripts\

    2. Открываем PhpEd.

    Settings > Tools > Integration
    Создаем новое меню «Scripts»
    Создаем новое подменю «CodeSniffer»

    3. Редактируем созданный пункт:

    — Execute with «Shell»
    — Command line:
    "c:\Program Files\NuSphere\PhpED\php5\php.exe" "c:\Program Files\NuSphere\PhpED\scripts\codesnifferwrapper.php" "@Fname@"
    — Shortcut: CTL-ALT-0 (или любой удобный)
    — Ставим крестики в следующих пунктах:
    Show this command in Workspace popup – for files
    Show this command in Explorer popup – for files
    Show this command in File Bar popup
    Redirect Output Stream to log window


    Сохраняем результат, открываем любой php файл, жмем назначенное сочетание клавиш и любуемся.

    Комментарии 10

      0
      А что PhpEd нет умеет делать reformat code. Вроде как мастхэв фича для современных IDE вроде PhpStorm.
        0
        И да и нет, с ним в комплекте идет инструмент polystyle, который делает это за него. Но мне больше по душе использование PHP_Beautifier
          0
          Не умеет. Лично в пользовании PhpED уж сколько лет наравне с зенд-студией, и вот что в нем жутко бесит по сравнению с zend-ом, это именно отсутствие коде-форматтера (ну и пожалуй коде аналайзера).
          В комплекте идет polystyle который в рекламе PhpED позволяет утверждать что форматтер есть, но он триальный:-\ И работает в мясо неудобным образом — по сути он не встроенный, а как бы навесной, отсюда и неудобства.
          0
          Спасибо, сейчас попробую.
            +1
            Не пошло :(
              0
              Попоробуйте в шаге №0 сделать
              c:\Program Files\NuSphere\PhpED\php5> pear install php_codesniffer
              Автору поста: возможно ошибка? у меня тоже пакет php_sniffer не найден на стандартном канале
                0
                Да с этим я разобрался.
                Там ещё дальше будет трабла с функцией http_build_str, которая не работает в cli (непонятно как у автора это заработало). Это я всё тоже пофиксил, в итоге оно кое-как заработало, но обещаная фишка с колонкой location так и не заработала — там всегда ссылка на первую найденную ошибку.
                Насколько я понял это глюк IDE (возможно конкретной версии, у меня 6.1.6118), скрипт всё правильно выдаёт.
                Связаться с автором поста тоже не получилось.
                  0
                  Идем в каталог C:\Program Files\NuSphere\PhpED\php5\extensions\ и проверяем наличие файлика php_http.dll. Если файлик есть — уже хорошо. Если нету, но очень хочется — ищем на просторах сети(мне повезло, у меня этот файлик есть). В файлике c:\Program Files\NuSphere\PhpED\php5\php.ini дописываем или если есть раскомментируем строку extension=php_http.dll после этого точно все работает. проверено на версии 5.9.5921
                    0
                    Поставил себе триал 6.1.6118. В нем явный глюк, он выводит корректно только первое сообщение в лог, дальше location выдается все время одинаковый.
              0
              Кстати, таким же образом можно много чего прикрутить. С ходу в голову напрашивается jslint

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое