как проверить дублирование кода в magento 2 Extension?

15

Я создал модуль в Magento 2 и сейчас пытаюсь отправить его на Magento Marketplace. Мое продление перешло из бизнес-обзора и технического обзора, но у меня возникли проблемы с проверкой качества.

Я получил письмо от торговой площадки Magento, в котором говорилось, что в моем расширении дублируется код. Ниже приведен образец письма.

Проблемы с качеством кода: CPD: это расширение содержит дублированный код.

Когда я зашел в свой продукт на учетной записи Marketplace и проверил технический отчет, я обнаружил ниже.

Дубликаты кода обнаружены

Это расширение содержит код, который непосредственно скопирован из кодовой базы Magento. Это является прямым нарушением разделов 3.1 и 9.1b Соглашения разработчика Magento.

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

Есть ли способ проверить наличие дублирования кода на моей установке, чтобы избежать этой проблемы для других моих расширений?

Сагар Добария
источник

Ответы:

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
Здравствуйте, nikhil, не могли бы вы объяснить подробно
Сагар Добария
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функция будет проверять наличие любого .txtфайла, добавленного в папку dev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist . Он прочтет файл и проигнорирует все папки, которые будут исключены из процесса обнаружения кода копирования-вставки.

После добавления всех файлов / папок черного списка в код он будет запущен под кодом.

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

Этот код будет выполнять runфункцию файла dev / tests / static / framework / Magento / TestFramework / CodingStandard / Tool / 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

Выходные данные для выполнения этой команды будут добавлены в файл, определенный в testCopyPasteфункции. Имя файла для обнаружения копирования-вставки: phpcpd_report.xml, расположенный в папке dev / tests / static / report location.

После успешного выполнения команды выходные данные будут добавлены в файлы отчетов.

Джаймин Сутария
источник
Можете ли вы предложить какие - либо решения этого вопроса дублирования кода - magento.stackexchange.com/q/191829/20064
Piyush
Здравствуйте, @nikhil. Скажите, пожалуйста, какая строка указывает на ошибку типа «Это расширение содержит дублированный код». в phpcpd_report.xml
Emipro Technologies Pvt. Ltd.