Установка исключений из правила в phpmd

Я пытаюсь установить исключение из правила в 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

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>

Мы также можем создать собственный набор правил 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
Другие вопросы по тегам