magento 2 Extensionでコードの重複をチェックする方法は?


15

Magento 2でモジュールを作成しましたが、Magento Marketplaceで送信しようとしています。私の拡張機能はビジネスレビューとテクニカルレビューから合格しましたが、QAレビューの問題に直面しています。

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

他の拡張機能でこの問題を回避するために、セットアップでコードの重複を確認する方法はありますか?

回答:


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、詳細を説明してください
サガル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]);

このコードはrundev / 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

このコマンド実行の出力は、testCopyPastefunctionで定義されたファイルに追加されます。コピー/ペースト検出のファイル名は、dev / tests / static / reportにあるphpcpd_report.xmlです。

コマンドが正常に実行されると、レポートファイルに出力が追加されます。


このコード重複の問題に対する解決策を提案できますか-magento.stackexchange.com/q/191829/20064
Piyush

こんにちは、@ nikhilは、「この拡張機能には重複したコードが含まれています」などのエラーを示す行を教えてください。phpcpd_report.xml
Emipro Technologies Pvt。株式会社
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.