Пользовательские стандарты кодирования не работают - 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, какие параметры конфигурации он обнаружил и т. Д.