【问题标题】:build.xml copy+paste detector won't pick up duplicated codesbuild.xml 复制+粘贴检测器不会拾取重复的代码
【发布时间】:2014-09-20 20:08:26
【问题描述】:

下面的重复代码存在于两个不同的控制器文件中,但 build.xml 中的复制粘贴检测器在运行 phing 时不会检测到它。它生成的报告文件只有一个空块,如下所示。谁能告诉我我错过了什么?

提前致谢

探测器报告:

<?xml version="1.0" encoding="UTF-8"?>
<pmd-cpd/>


zzz@ubuntu:$ bin/phpcpd src/Foo/TeBundle/Controller/Create/LeController.php 
phpcpd 2.0.1-5-ga7488a0 by Sebastian Bergmann.

0.00% duplicated lines out of 134 total lines of code.

Time: 25 ms, Memory: 3.00Mb
  • 控制器 1: src/Football/TeamBundle/Controller/Create/CountryController.php
  • 控制器 2: src/Football/TeamBundle/Controller/Create/CityController.php

重复代码:

public function indexAction()
{
    $form = $this->getForm();

    if (is_null($form)) {
        echo 'form empty';
    } else {
        echo 'not empty';
    }
}

public function indexAction()
{
    $form = $this->getForm();

    if (is_null($form)) {
        echo 'form empty';
    } else {
        echo 'not empty';
    }
}

BUILD.XML

<?xml version="1.0" encoding="UTF-8"?>

<project name="Sport" default="detect-copy-paste" basedir=".">

    <!-- GLOBAL VARIABLES -->
    <property name="dir-source" value="${project.basedir}/src" />
    <property name="dir-report" value="test/report/phing" />
    <!-- END -->

    <!-- FILESET -->
    <fileset id="sourcecode" dir="${dir-source}">
        <include name="**/*.php" />
    </fileset>
    <!-- END -->


    <!-- COPY and PASTE DETECTOR -->
    <target name="detect-copy-paste" description="Checks similar code blocks.">
        <echo msg="Checking similar code blocks ..." />
        <phpcpd>
            <fileset refid="sourcecode" />
            <formatter type="pmd" outfile="${dir-report}/copypaste.xml" />
        </phpcpd>
    </target>
    <!-- END -->

</project>

COMPOSER.JSON

{
    "autoload": {
        "psr-0": {
            "": "src/",
            "SymfonyStandard": "app/"
        }
    },
"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.5.*",
    "doctrine/orm": "~2.2,>=2.2.3",
    "doctrine/doctrine-bundle": "~1.2",
    "twig/extensions": "~1.0",
    "symfony/assetic-bundle": "~2.3",
    "symfony/swiftmailer-bundle": "~2.3",
    "symfony/monolog-bundle": "~2.4",
    "sensio/distribution-bundle": "~3.0",
    "sensio/framework-extra-bundle": "~3.0",
    "incenteev/composer-parameter-handler": "~2.0",
    "behat/behat": "2.5.*@stable",
    "behat/behat-bundle": "1.0.0",
    "behat/symfony2-extension": "1.1.2",
    "behat/mink": "1.5.0",
    "behat/mink-extension": "~1.3",
    "behat/mink-selenium2-driver": "1.1.1",
    "behat/mink-goutte-driver": "1.0.9",
    "phing/phing": "2.8.2",
    "squizlabs/php_codesniffer": "1.5.1",
    "doctrine/doctrine-fixtures-bundle": "2.2.*",
    "pdepend/pdepend": "2.0.*",
    "phpmd/phpmd" : "2.0.*",
    "sebastian/phpcpd": "@dev",
    "sebastian/finder-facade": "~1.1",
    "sebastian/version": "~1.0.3",
    "symfony/console": "~2.2",
    "phpunit/php-timer": "~1.0.4",
    "theseer/fdomdocument": "~1.4"
}
}

【问题讨论】:

  • 手动运行phpmd命令是否也有同样的结果?
  • "134 行代码中有 0.00% 重复行。"
  • 这很奇怪,因为一切似乎都很顺利,没有任何错误,但由于某种原因它无法识别重复项。
  • 但是bin/phpcpd src/Foo/TeBundle/Controller/Create/LeController.php 不正确。使用此命令,您只需检查控制器。 bin/phpcpd src/的结果是什么
  • 这次检查的更多行:0.00% duplicated lines out of 1692 total lines of code.

标签: symfony phing phpmd


【解决方案1】:

没有检测到重复代码是因为token数不够是你的代码sn-p,会检测到如下:

public function indexAction()
{
    $form = $this->getForm('kikoo');

    if (is_null($form)) {
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
        echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty'; echo 'form empty';
    } else {
        echo 'not empty';
    }
}

您可以更改默认为 70 的 min-tokens 参数:

phpcpd src/ --progress --min-lines=5 --min-tokens=70

【讨论】:

  • 非常好,它现在可以工作了:) 有没有办法在我的 build.xml 条目中将 --min-tokens 指定为 50
  • 查看&lt;arg line="--min-token=50"&gt; 选项,应该是这样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2014-07-19
相关资源
最近更新 更多