3

我正在尝试为 phpmd 中的规则设置一个例外,以允许一个特定的函数名称长度仅为 2 个字符

以前的phpmd.xml.dist文件非常愉快地工作:

<?xml version="1.0" encoding="UTF-8" ?>
<ruleset name="Complex PHP Mess Detector Rule Set"
    xmlns="http://pmd.sf.net/ruleset/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
    <rule ref="rulesets/naming.xml">
        <exclude name="LongVariable" />
    </rule>
    <rule ref="rulesets/naming.xml/LongVariable">
        <properties>
            <property name="maximum" value="32" />
        </properties>
    </rule>
    <rule ref="rulesets/design.xml/ExitExpression" />
    <rule ref="rulesets/design.xml/EvalExpression" />
    <rule ref="rulesets/design.xml/GotoStatement" />
    <rule ref="rulesets/design.xml/DepthOfInheritance" />
    <rule ref="rulesets/design.xml/CouplingBetweenObjects" />
    <rule ref="rulesets/design.xml/NumberOfChildren" />
    <rule ref="rulesets/unusedcode.xml" />
    <rule ref="rulesets/controversial.xml" />
</ruleset>

我已经添加了一个条目rulesets/naming.xml/ShortMethod,所以它现在看起来像:

<?xml version="1.0" encoding="UTF-8" ?>
<ruleset name="Complex PHP Mess Detector Rule Set"
    xmlns="http://pmd.sf.net/ruleset/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
    <rule ref="rulesets/naming.xml">
        <exclude name="LongVariable,ShortMethod" />
    </rule>
    <rule ref="rulesets/naming.xml/LongVariable">
        <properties>
            <property name="maximum" value="32" />
        </properties>
    </rule>
    <rule ref="rulesets/naming.xml/ShortMethod">
        <properties>
            <property name="minimum" value="3" />
            <property name="exceptions" value="ln" />
        </properties>
    </rule>
    <rule ref="rulesets/design.xml/ExitExpression" />
    <rule ref="rulesets/design.xml/EvalExpression" />
    <rule ref="rulesets/design.xml/GotoStatement" />
    <rule ref="rulesets/design.xml/DepthOfInheritance" />
    <rule ref="rulesets/design.xml/CouplingBetweenObjects" />
    <rule ref="rulesets/design.xml/NumberOfChildren" />
    <rule ref="rulesets/unusedcode.xml" />
    <rule ref="rulesets/controversial.xml" />
</ruleset>

但是现在当我尝试运行它时出现以下错误:

Catchable fatal error: Argument 1 passed to PHPMD\RuleSetFactory::parsePropertiesNode() must implement interface PHPMD\Rule, null given,
called in phar://Utilities/PHP/phpmd.phar/src/main/php/PHPMD/RuleSetFactory.php on line 462
and defined in phar://Utilities/PHP/phpmd.phar/src/main/php/PHPMD/RuleSetFactory.php on line 489

phpmd 是 2.6.0 版

4

2 回答 2

2

好吧,我找到了答案:编写单独的排除元素而不是逗号分隔的列表,并确保我有正确的规则名称(ShortMethodName而不是简单的ShortMethod):

<?xml version="1.0" encoding="UTF-8" ?>
<ruleset name="Complex PHP Mess Detector Rule Set"
    xmlns="http://pmd.sf.net/ruleset/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
    <rule ref="rulesets/naming.xml">
        <exclude name="LongVariable" />
        <exclude name="ShortMethodName" />
    </rule>
    <rule ref="rulesets/naming.xml/LongVariable">
        <properties>
            <property name="maximum" value="32" />
        </properties>
    </rule>
    <rule ref="rulesets/naming.xml/ShortMethodName">
        <properties>
            <property name="minimum" value="3" />
            <property name="exceptions" value="ln" />
        </properties>
    </rule>
    <rule ref="rulesets/design.xml/ExitExpression" />
    <rule ref="rulesets/design.xml/EvalExpression" />
    <rule ref="rulesets/design.xml/GotoStatement" />
    <rule ref="rulesets/design.xml/DepthOfInheritance" />
    <rule ref="rulesets/design.xml/CouplingBetweenObjects" />
    <rule ref="rulesets/design.xml/NumberOfChildren" />
    <rule ref="rulesets/unusedcode.xml" />
    <rule ref="rulesets/controversial.xml" />
</ruleset>
于 2018-02-06T12:20:34.410 回答
1

我们也可以在不添加其他规则集的情况下创建 phpmd 自定义规则集

<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set">

    <description>
       My custom rule set that checks my code...
    </description>
    <pmd version="@project.version@" timestamp="2017-09-29T20:00:17+00:00">
     <!-- Import the entire unused code rule set -->
         <rule ref="PHPMD/Rule/CyclomaticComplexity" />
         <rule ref="PHPMD/Rule/Design/NPathComplexity"/>
   </pmd>

无论您要设置什么规则,都可以在 usr/share/PHPMD/Rule 上找到,之后您可以在终端上触发命令

phpmd sourcefile.php xml codesize,phpmdruleset.xml
于 2018-09-28T04:24:13.613 回答