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

다른 확장 프로그램에서이 문제를 피하기 위해 설정에서 코드 중복을 확인할 수있는 방법이 있습니까?

답변:


6

마 젠토 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>

이 파일에는 다른 코드 테스트를 위해 실행할 파일을 정의하는 위의 코드가 있습니다.

좁히려면 testsuite / Magento / Test / Php / LiveCodeTest.phpPHP Coding Standard Verification testsuite 파일이 실행됩니다.

이 파일을 열면 다양한 유형의 코드 문제를 확인하는 다양한 기능을 찾을 수 있습니다. 실행될 기능은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]);

이 코드는 dev / tests / static / framework / Magento / TestFramework / CodingStandard / Tool / CopyPasteDetector.php 파일의 run기능을 실행 합니다.

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기능에 정의 된 파일에 추가됩니다 . 복사 붙여 넣기 감지의 파일 이름 은 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.