我正在创建一个自定义规则集,用于在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一起使用......
答案 0 :(得分:3)
首先,你的WordPress问题。您的规则集包括以下行:
<rule ref="WordPress"/>
告诉PHPCS加载整个WordPress编码标准。但PHPCS没有附带WordPress编码标准,所以你需要告诉PHPCS它在哪里。
当你作曲家安装你的项目时,作曲家克隆了WordPress编码标准repo,它的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标准的目录。现在,当您在ruleset.xml文件中说WordPress
时,PHPCS知道要查找的位置。
您还会发现运行vendor/bin/phpcs -i
会显示WordPress编码标准已“安装”。
如果您不希望composer install
编码标准使其正常工作,您可以在其他地方克隆WordPress编码标准并手动运行phpcs --config-set installed_paths /path/to/WordPress-Coding-Standards
。
没有选择自定义嗅探器的原因是因为它们不在与ruleset.xml文件相同级别的Sniffs
目录中。您需要将ruleset.xml文件直接放入Infinum
目录,而不是放在repo的最顶层。或者,您可以将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嗅探的位置,它检测到的配置选项等。