自定义编码标准嗅探不起作用 - PHP_CodeSniffer_Exception
Custom coding standards sniffs not working - 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
当我在我的项目中使用 composer 安装它时,它位于 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 一起使用...
首先,关于您的 WordPress 问题。您的规则集包括此行:
<rule ref="WordPress"/>
这告诉 PHPCS 加载整个 WordPress 编码标准。但是 PHPCS 没有附带 WordPress 编码标准,所以你需要告诉 PHPCS 它在哪里。
当您 composer 安装您的项目时,composer 会克隆 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 标准全部由 composer 放置的目录。现在,当您在 ruleset.xml 文件中输入 WordPress
时,PHPCS 知道要查找的位置。
您还会发现 运行ning vendor/bin/phpcs -i
会显示 WordPress 编码标准是 "installed".
如果您不想 composer install
您的编码标准来使其工作,您可以在其他地方克隆 WordPress 编码标准并 运行 phpcs --config-set installed_paths /path/to/WordPress-Coding-Standards
手动。
您的自定义嗅探未被拾取的原因是因为它们不在与您的 ruleset.xml 文件同一级别的 Sniffs
目录中。您需要将 ruleset.xml 文件直接放入 Infinum
目录中,而不是放在存储库的最顶层。或者,您可以将 Sniffs
目录移动到顶层。
此更改还允许您使用它的名称指定您的编码标准。您可以使用 --standard=vendor/infinum/coding-standards-wp/Infinum
.
而不是 --standard=vendor/infinum/coding-standards-wp
一旦你这样做了(或者可能之前和之后),尝试 运行ning 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 嗅探器、它检测到的配置选项等。
我正在为在 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
当我在我的项目中使用 composer 安装它时,它位于 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 一起使用...
首先,关于您的 WordPress 问题。您的规则集包括此行:
<rule ref="WordPress"/>
这告诉 PHPCS 加载整个 WordPress 编码标准。但是 PHPCS 没有附带 WordPress 编码标准,所以你需要告诉 PHPCS 它在哪里。
当您 composer 安装您的项目时,composer 会克隆 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 标准全部由 composer 放置的目录。现在,当您在 ruleset.xml 文件中输入 WordPress
时,PHPCS 知道要查找的位置。
您还会发现 运行ning vendor/bin/phpcs -i
会显示 WordPress 编码标准是 "installed".
如果您不想 composer install
您的编码标准来使其工作,您可以在其他地方克隆 WordPress 编码标准并 运行 phpcs --config-set installed_paths /path/to/WordPress-Coding-Standards
手动。
您的自定义嗅探未被拾取的原因是因为它们不在与您的 ruleset.xml 文件同一级别的 Sniffs
目录中。您需要将 ruleset.xml 文件直接放入 Infinum
目录中,而不是放在存储库的最顶层。或者,您可以将 Sniffs
目录移动到顶层。
此更改还允许您使用它的名称指定您的编码标准。您可以使用 --standard=vendor/infinum/coding-standards-wp/Infinum
.
--standard=vendor/infinum/coding-standards-wp
一旦你这样做了(或者可能之前和之后),尝试 运行ning 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 嗅探器、它检测到的配置选项等。