如何在magento 2 Extension中检查代码重复?


15

我已经在Magento 2中创建了一个模块,现在我正尝试在Magento Marketplace上提交该模块。我的扩展程序已通过业务审查和技术审查,但是我面临质量检查审查的问题。

我收到了Magento市场的一封邮件,说我的扩展程序中有代码重复。以下是邮件示例。

代码质量问题:CPD:此扩展名包含重复的代码。

当我通过Marketplace帐户访问产品并检查技术报告时,发现以下内容。

检测到代码重复

该扩展包含直接从Magento代码库复制的代码。这直接违反了《 Magento开发人员协议》第3.1和9.1b条。

File: vendor/module/vendor-module-1.0.0.0/Block/Adminhtml/Module/Edit/Tab/Stores.php
Line: 58
File: magento/module-checkout-agreements/magento-module-checkout-agreements-100.0.6.0/Block/Adminhtml/Agreement/Edit/Form.php
Line: 122

File: magento/module-cms/magento-module-cms-100.0.7.0/Block/Adminhtml/Block/Edit/Form.php
Line: 100
File: vendor/module/vendor-module-1.0.0.0/Block/Adminhtml/Module/Renderer/Files.php
Line: 49

File: magento/framework/magento-framework-100.0.16.0/Data/Form/Element/Image.php
Line: 86
File: vendor/module/vendor-module-1.0.0.0/Model/ResourceModel/AbstractCollection.php
Line: 2
File: magento/module-cms/magento-module-cms-100.0.7.0/Model/ResourceModel/AbstractCollection.php
Line: 6

有什么方法可以检查安装程序中的代码重复,以避免其他扩展名出现此问题?

Answers:


6

Magento 2安装文件夹

步骤1进行代码扩展检查

/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist
rename common.txt--

步骤2执行以下命令

php bin/magento dev:tests:run static

步骤-3查看重复代码

dev/tests/static/report
phpcpd_report.xml

现在检查 phpcpd_report.xml


1
您好尼克希尔,您能否详细解释一下
Sagar Dobariya

6

这是用于检查代码重复的Magento 2命令的一些描述。

下面是检查代码重复/复制粘贴的命令。

php bin/magento dev:tests:run static

此命令将首先转到dev/tests/static文件夹。在这里,您可以看到此测试套件的声明文件phpunit.xml.dist

<testsuites>
    <testsuite name="Less Static Code Analysis">
        <file>testsuite/Magento/Test/Less/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="Javascript Static Code Analysis">
        <file>testsuite/Magento/Test/Js/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="PHP Coding Standard Verification">
        <file>testsuite/Magento/Test/Php/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="Code Integrity Tests">
        <directory>testsuite/Magento/Test/Integrity</directory>
    </testsuite>
    <testsuite name="Xss Unsafe Output Test">
        <file>testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php</file>
    </testsuite>
</testsuites>

在此文件中,您将找到上面的代码,这些代码将定义要针对不同的代码测试执行的文件。

要缩小范围,您可以看到PHP Coding Standard Verification testsuite它将执行文件testsuite / Magento / Test / Php / LiveCodeTest.php

当您打开此文件时,您将找到不同的功能来检查不同类型的代码问题。将要执行的功能是testCopyPaste

public function testCopyPaste()
{
    $reportFile = self::$reportDir . '/phpcpd_report.xml';
    $copyPasteDetector = new CopyPasteDetector($reportFile);

    if (!$copyPasteDetector->canRun()) {
        $this->markTestSkipped('PHP Copy/Paste Detector is not available.');
    }

    $blackList = [];
    foreach (glob(__DIR__ . '/_files/phpcpd/blacklist/*.txt') as $list) {
        $blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
    }

    $copyPasteDetector->setBlackList($blackList);

    $result = $copyPasteDetector->run([BP]);

    $output = "";
    if (file_exists($reportFile)) {
        $output = file_get_contents($reportFile);
    }

    $this->assertTrue(
        $result,
        "PHP Copy/Paste Detector has found error(s):" . PHP_EOL . $output
    );
}

在这里,您会找到一个代码,该代码将从此代码检查中将所有文件/文件夹列入黑名单。

foreach (glob(__DIR__ . '/_files/phpcpd/blacklist/*.txt') as $list) {
    $blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
}

foreach功能将检查.txtdev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist位置中添加的任何文件。它将读取文件,并将忽略所有文件夹以排除在复制粘贴代码检测过程之外。

将所有黑名单文件/文件夹添加到代码后,它将在代码下面运行。

$result = $copyPasteDetector->run([BP]);

此代码将执行run的功能开发/测试/静态/框架/ Magento的/ TestFramework / CodingStandard /工具/ CopyPasteDetector.php文件。

public function run(array $whiteList)
{
    $blackListStr = ' ';
    foreach ($this->blacklist as $file) {
        $file = escapeshellarg(trim($file));
        if (!$file) {
            continue;
        }
        $blackListStr .= '--exclude ' . $file . ' ';
    }

    $vendorDir = require BP . '/app/etc/vendor_path.php';
    $command = 'php ' . BP . '/' . $vendorDir . '/bin/phpcpd' . ' --log-pmd ' . escapeshellarg(
            $this->reportFile
        ) . ' --names-exclude "*Test.php" --min-lines 13' . $blackListStr . ' ' . implode(' ', $whiteList);

    exec($command, $output, $exitCode);

    return !(bool)$exitCode;
}

在这里,代码将所有blacklisted文件夹/文件添加到--exclude列表中。

之后,它将运行vendor/bin/phpcpd命令。

Magento本身在命令中

Test按代码排除所有 文件

--names-exclude "*Test.php" 

它也跳过了所有少于13行的重复代码

--min-lines 13

该命令执行的输出将添加到testCopyPastefunction中定义的文件中。用于检测复制粘贴的文件名是phpcpd_report.xml,位于dev / tests / static / report位置。

成功执行命令后,输出将添加到报告文件中。


您能提出任何解决此代码重复问题的方法吗-magento.stackexchange.com/q/191829/20064
Piyush

您好,@ nikhil,您能告诉我哪行显示错误,例如“此扩展名包含重复的代码。” 在phpcpd_report.xml中
Emipro Technologies Pvt。公司
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.