自定义编码标准嗅探不起作用 - 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 嗅探器、它检测到的配置选项等。