jak sprawdzić duplikację kodu w Magento 2 Extension?

15

Stworzyłem moduł w Magento 2 i teraz próbuję go przesłać na Magento Marketplace. Moje rozszerzenie przeszło z przeglądu biznesowego i technicznego, ale mam problemy z przeglądem kontroli jakości.

Otrzymałem wiadomość z rynku Magento z informacją, że mam duplikację kodu w moim rozszerzeniu. Poniżej znajduje się próbka wiadomości.

Problemy z jakością kodu: CPD: To rozszerzenie zawiera zduplikowany kod.

Kiedy poszedłem do mojego produktu na koncie Marketplace i sprawdziłem raport techniczny, znalazłem poniżej.

Wykryto duplikaty kodu

To rozszerzenie zawiera kod, który jest kopiowany bezpośrednio z bazy kodu Magento. Stanowi to bezpośrednie naruszenie sekcji 3.1 i 9.1b umowy dewelopera 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

Czy jest jakiś sposób, aby sprawdzić duplikację kodu w mojej instalacji, aby uniknąć tego problemu w przypadku innych rozszerzeń?

Sagar Dobariya
źródło

Odpowiedzi:

6

Folder instalacyjny Magento 2

Krok 1 do sprawdzenia z rozszerzeniem kodu

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

Krok 2 uruchom poniżej polecenia

php bin/magento dev:tests:run static

Krok -3 patrz kod duplikacji

dev/tests/static/report
phpcpd_report.xml

Teraz sprawdź phpcpd_report.xml

Nikhil Vaghela
źródło
1
Witaj nikhil, czy możesz wyjaśnić szczegółowo
Sagar Dobariya
6

Oto opis komendy Magento 2 używanej do sprawdzania duplikacji kodu.

Polecenie sprawdzenia duplikacji kodu / kopiuj-wklej znajduje się poniżej.

php bin/magento dev:tests:run static

To polecenie najpierw przejdzie do dev/tests/staticfolderu. Tutaj możesz zobaczyć plik deklaracji phpunit.xml.dist dla tego zestawu testów.

<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>

W tym pliku znajdziesz powyższy kod, który określi, który plik ma zostać wykonany dla różnych testów kodu.

W celu zawężenia możesz zobaczyć PHP Coding Standard Verification testsuiteTo spowoduje uruchomienie pliku testsuite / Magento / Test / Php / LiveCodeTest.php

Po otwarciu tego pliku znajdziesz różne funkcje do sprawdzania różnych rodzajów problemów z kodem. Funkcja, która zostanie wykonana totestCopyPaste

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
    );
}

Tutaj znajdziesz kod, który zostanie użyty do umieszczenia na czarnej liście dowolnego pliku / folderu z tej kontroli kodu.

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

Ta foreachfunkcja sprawdzi, czy .txtplik jest dodany w lokalizacji dev / test / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist . Odczyta plik i zignoruje wszystkie foldery, aby wykluczyć z procesu wykrywania kodu wklejania kopii.

Po dodaniu wszystkich plików / folderów z czarnej listy do kodu, będzie on działał poniżej kodu.

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

Ten kod wykona runfunkcję pliku dev / test / 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;
}

Tutaj kod dodaje wszystkie blacklistedfoldery / pliki z --excludelisty.

Następnie uruchomi vendor/bin/phpcpdpolecenie.

Tutaj w samym poleceniu ma Magento

wykluczono wszystkie Testpliki według kodu

--names-exclude "*Test.php" 

Pominął również wszystkie duplikaty kodu, które mają mniej niż 13 linii według kodu

--min-lines 13

Dane wyjściowe do wykonania tego polecenia zostaną dodane do pliku zdefiniowanego w testCopyPastefunkcji. Nazwa pliku do wykrywania wklejania kopii to phpcpd_report.xml znajdująca się w lokalizacji dev / test / static / report .

Po pomyślnym wykonaniu polecenia dane wyjściowe zostaną dodane do plików raportów.

Jaimin Sutariya
źródło
Czy możesz zasugerować rozwiązanie tego problemu duplikacji kodu - magento.stackexchange.com/q/191829/20064
Piyush
Witaj @nikhil, czy możesz mi powiedzieć, który wiersz wskazuje błąd, taki jak „To rozszerzenie zawiera zduplikowany kod”. w phpcpd_report.xml
Emipro Technologies Pvt. Sp. z o.o.