自定义编码标准嗅探不起作用 - PHP_CodeSniffer_Exception

时间:2017-07-13 11:00:00

标签: php wordpress codesniffer phpcodesniffer

我正在创建一个自定义规则集,用于在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一起使用......

1 个答案:

答案 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嗅探的位置,它检测到的配置选项等。