3

我正在为在 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 一起使用......

4

1 回答 1

4

首先,对于您的 WordPress 问题。您的规则集包括这一行:

<rule ref="WordPress"/>

这告诉 PHPCS 加载整个 WordPress 编码标准。但是 PHPCS 没有附带 WordPress 编码标准,所以你需要告诉 PHPCS 它在哪里。

当你 composer 安装你的项目时,composer 会克隆 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 标准都已由 composer 放置的目录。现在当你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目录中,而不是放在您的 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 嗅探器、它检测到的配置选项等。

于 2017-07-13T22:51:31.627 回答