Wie überprüfe ich die Codeduplizierung in Magento 2 Extension?

15

Ich habe ein Modul in Magento 2 erstellt und versuche es nun auf dem Magento Marketplace einzureichen. Meine Erweiterung wurde von der Geschäftsüberprüfung und der technischen Überprüfung abgelöst, aber ich habe Probleme mit der QS-Überprüfung.

Ich habe eine E-Mail vom Magento-Marktplatz erhalten, die besagt, dass meine Erweiterung Codeduplikationen enthält. Unten ist das Beispiel der Mail.

Probleme mit der Codequalität: CPD: Diese Erweiterung enthält doppelten Code.

Als ich im Marketplace-Konto zu meinem Produkt ging und den technischen Bericht überprüfte, stellte ich Folgendes fest.

Codeduplikate erkannt

Diese Erweiterung enthält Code, der direkt aus der Magento-Codebasis kopiert wird. Dies verstößt direkt gegen die Abschnitte 3.1 und 9.1b der Magento-Entwicklervereinbarung.

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

Kann ich in meinem Setup überprüfen, ob Code doppelt vorhanden ist, um dieses Problem bei meinen anderen Erweiterungen zu vermeiden?

Sagar Dobariya
quelle

Antworten:

6

Magento 2 Setup-Ordner

Schritt-1 zur Überprüfung mit Codeerweiterung

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

Schritt-2 unter Befehl ausführen

php bin/magento dev:tests:run static

Schritt -3 siehe Duplizierungscode

dev/tests/static/report
phpcpd_report.xml

Jetzt überprüfen phpcpd_report.xml

Nikhil Vaghela
quelle
1
Hallo Nikhil, können Sie bitte im Detail erklären
Sagar Dobariya
6

Hier finden Sie eine Beschreibung des Magento 2-Befehls, mit dem die Codeduplizierung überprüft wird.

Der Befehl zum Überprüfen der Codeduplizierung / des Kopierens und Einfügens ist unten aufgeführt.

php bin/magento dev:tests:run static

Dieser Befehl wechselt zuerst in den dev/tests/staticOrdner. Hier sehen Sie die Deklarationsdatei phpunit.xml.dist für diese Testsuite.

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

In dieser Datei finden Sie den obigen Code, der definiert, welche Datei für verschiedene Codetests ausgeführt werden soll.

Zum Eingrenzen wird angezeigt,PHP Coding Standard Verification testsuite dass die Datei testsuite / Magento / Test / Php / LiveCodeTest.php ausgeführt wird

Wenn Sie diese Datei öffnen, finden Sie verschiedene Funktionen, mit denen Sie nach verschiedenen Arten von Code-Problemen suchen können. Die auszuführende Funktion isttestCopyPaste

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

Hier finden Sie einen Code, mit dem alle Dateien / Ordner aus dieser Codeüberprüfung auf die schwarze Liste gesetzt werden.

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

Diese foreachFunktion sucht nach .txtDateien, die im Verzeichnis dev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist hinzugefügt wurden . Es liest die Datei und ignoriert alle Ordner, die von der Erkennung des Kopier-Einfüge-Codes ausgeschlossen werden sollen.

Nachdem Sie alle Blacklist-Dateien / -Ordner zum Code hinzugefügt haben, wird der folgende Code ausgeführt.

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

Dieser Code führt die runFunktion der Datei dev / tests / static / framework / Magento / TestFramework / CodingStandard / Tool / CopyPasteDetector.php aus .

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

Hier fügt der Code alle blacklistedOrdner / Dateien in der --excludeListe hinzu.

Danach wird der vendor/bin/phpcpdBefehl ausgeführt.

Hier im Befehl selbst hat Magento

schloss alle TestDateien per Code aus

--names-exclude "*Test.php" 

Es wurden auch alle Code-Duplikate übersprungen, die weniger als 13 Code-Zeilen umfassen

--min-lines 13

Die Ausgabe für diese Befehlsausführung wird der in testCopyPastefunction definierten Datei hinzugefügt . Der Dateiname für die Erkennung durch Kopieren und Einfügen lautet phpcpd_report.xml und befindet sich unter dev / tests / static / report .

Nach erfolgreicher Ausführung des Befehls wird die Ausgabe zu den Berichtsdateien hinzugefügt.

Jaimin Sutariya
quelle
Können Sie eine Lösung für diese Frage der Code-Vervielfältigung vorschlagen
Piyush
Hallo @nikhil, kannst du mir bitte sagen, welche Zeile den Fehler anzeigt wie "Diese Erweiterung enthält doppelten Code." in phpcpd_report.xml
Emipro Technologies Pvt. Ltd.