Пользовательские стандарты кодирования не работают - PHP_CodeSniffer_Exception

Я работаю над созданием настраиваемого набора правил для сниффинга кода в WordPress и для этого использую PHP_CodeSniffer.

Пользовательский набор правил можно найти здесь: https://github.com/infinum/coding-standards-wp.

Теперь, когда я пытаюсь использовать их, я получаю эту ошибку

Fatal error: Uncaught exception 'PHP_CodeSniffer_Exception' with message 'Referenced sniff "WordPress" does not exist' in /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer.php:1167
Stack trace:
#0 /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer.php(780): PHP_CodeSniffer->_expandRulesetReference(Object(SimpleXMLElement), '/...', 0)
#1 /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer.php(578): PHP_CodeSniffer->processRuleset('/...')
#2 /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php(956): PHP_CodeSniffer->initStandard(Array, Array, Array)
#3 /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php(113): PHP_CodeSniffer_CLI->process()
#4 /wpcs/vendor/squizlabs/php_codesniffer/scripts/phpcs(25): PHP_CodeSniffer_CLI->runphpcs()
#5 {main}
  thrown in /wpcs/vendor/squizlabs/php_codesniffer/CodeSniffer.php on line 1167

Я понятия не имею, как это исправить. Я искал все вокруг и моделировал набор правил, как и другие люди, и я понятия не имею, почему это происходит.

РЕДАКТИРОВАТЬ:

Поэтому, когда я устанавливаю стандарты с помощью composer в моем проекте и запускаю

vendor/bin/phpcs --standard=vendor/infinum/coding-standards-wp wp-content/themes/twentyseventeen/functions.php

Это работает, просто по какой-то причине он не отвечает на мои собственные нюхательные сигналы.

И когда я положил стандарт кодирования в моем глобально установленном wpcs я получаю вышеуказанную ошибку в моей консоли Sublime.

РЕДАКТИРОВАТЬ 2:

Итак, у меня есть wpcs установлен в моей домашней папке. Там я разместил Infinum папка и внутри мои нюхают. Это работает только если я удаляю

 <config name="installed_paths" value="vendor/wp-coding-standards/wpcs"/>

от ruleset.xml

Мой Sublime поднимет его, и сниффы (теперь без пространств имен) работают как надо, все замечательно.

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

Разница, когда он загружен глобально (так что он доступен для Sublime) структура папок выглядит следующим образом

wpcs
  -- Infinum
    -- Sniffs
      -- Classes
        OnlyClassInFileSniff.php
      -- Shortcodes
        DisallowDoShortcodeSniff.php
    composer.json
    README.md
    ruleset.xml

И когда я устанавливаю его с композитором в моем проекте, он находится внутри vendor папка

vendor
  -- bin
  -- composer
  -- infinum
    -- coding-standards-wp
      -- Sniffs
        -- Classes
          OnlyClassInFileSniff.php
        -- Shortcodes
          DisallowDoShortcodeSniff.php
        composer.json
        README.md
        ruleset.xml
  -- squizlabs
  -- wp-coding-standards
    autoload.php

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Итак, я сделал это работать локально.

Он подбирает обычные нюхает и все.

Но теперь, если я помещу его в свою глобальную папку wpcs, я не смогу заставить его работать. Ну, я думаю, я просто переделаю это глобально, чтобы он работал с Sublime...

1 ответ

Решение

Во-первых, к вашей проблеме с WordPress. Ваш набор правил включает эту строку:

<rule ref="WordPress"/>

Это говорит PHPCS о загрузке во всем стандарте кодирования WordPress. Но PHPCS не поставляется со стандартом кодирования WordPress, поэтому вам нужно сообщить PHPCS, где он находится.

Когда вы компоновщик устанавливаете свой проект, он клонирует репозиторий стандартов кодирования WordPress, который имеет этот раздел в своем composer.json:

"scripts"    : {
    "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths ../../..",
    "post-update-cmd" : "\"vendor/bin/phpcs\" --config-set installed_paths ../../.."
}

--config-set installed_paths Команда сообщает PHPCS, где еще искать стандарты кодирования, кроме каталога по умолчанию. В этом случае стандарт WordPress говорит PHPCS искать в каталоге, где все стандарты WordPress были размещены композитором. Теперь, когда вы говорите WordPress в вашем файле ruleset.xml PHPCS знает, где искать.

Вы также найдете, что работает vendor/bin/phpcs -i покажет, что стандарты кодирования WordPress "установлены".

Если вы не хотите, чтобы composer install ваш стандарт кодирования, чтобы заставить его работать, вы можете клонировать стандарты кодирования WordPress где-нибудь еще и запустить phpcs --config-set installed_paths /path/to/WordPress-Coding-Standards вручную.


Причина, по которой ваши пользовательские нюхают, не обнаруживаются, заключается в том, что они не находятся в Sniffs каталог на том же уровне, что и ваш файл ruleset.xml. Вам нужно поместить файл ruleset.xml прямо в ваш Infinum каталог, а не на самом верхнем уровне вашего репо. Или вы можете переместить Sniffs каталог на верхний уровень.

Это изменение также позволит вам указать свой стандарт кодирования, используя его название. Вместо --standard=vendor/infinum/coding-standards-wp вы бы использовали --standard=vendor/infinum/coding-standards-wp/Infinum,

Как только вы сделаете это (или, возможно, до и после), попробуйте запустить phpcs с -vv аргумент командной строки. Например, перед запуском изменения:

vendor/bin/phpcs -vv --standard=vendor/infinum/coding-standards-wp wp-content/themes/twentyseventeen/functions.php

И после изменения запустить:

vendor/bin/phpcs -vv --standard=vendor/infinum/coding-standards-wp/Infinum wp-content/themes/twentyseventeen/functions.php

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

Processing ruleset coding-standards-wp/Infinum/ruleset.xml
    Adding sniff files from coding-standards-wp/Infinum/Sniffs directory
        => coding-standards-wp/Infinum/Sniffs/Classes/OnlyClassInFileSniff.php
        => coding-standards-wp/Infinum/Sniffs/Shortcodes/DisallowDoShortcodeSniff.php

Вы также увидите, где он нашел нюхает WordPress, какие параметры конфигурации он обнаружил и т. Д.

Другие вопросы по тегам