como verificar a duplicação de código na extensão magento 2?

15

Eu criei um módulo no Magento 2 e agora estou tentando enviá-lo no Magento Marketplace. Minha extensão passou das análises de negócios e análise técnica, mas estou enfrentando problemas com a análise de controle de qualidade.

Recebi um e-mail do mercado Magento informando que havia duplicação de código em minha extensão. Abaixo está a amostra do correio.

Problemas de qualidade do código: CPD: esta extensão contém código duplicado.

Quando fui ao meu produto na conta do Marketplace e verifiquei o relatório técnico, encontrei abaixo.

Duplicatas de código detectadas

Esta extensão contém código que é copiado diretamente da base de código Magento. Isso viola as Seções 3.1 e 9.1b do Contrato de desenvolvedor 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

Existe alguma maneira de verificar a duplicação de código na minha instalação para evitar esse problema nas minhas outras extensões?

Sagar Dobariya
fonte

Respostas:

6

Pasta de instalação do Magento 2

Etapa 1 para verificação com extensão de código

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

Etapa 2 - Executar abaixo do comando

php bin/magento dev:tests:run static

Etapa -3, veja o código de duplicação

dev/tests/static/report
phpcpd_report.xml

Agora verifica phpcpd_report.xml

Nikhil Vaghela
fonte
11
Olá nikhil, você pode agradar a explicar em detalhe
Sagar Dobariya
6

Aqui está uma descrição para o comando Magento 2 usado para verificar a duplicação de código.

O comando para verificar a duplicação de código / copiar e colar está abaixo.

php bin/magento dev:tests:run static

Este comando irá primeiro para a dev/tests/staticpasta. Aqui você pode ver o arquivo de declaração phpunit.xml.dist para este conjunto de testes.

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

Neste arquivo, você encontrará o código acima, que definirá o arquivo a ser executado para diferentes testes de código.

Para diminuir, você pode ver PHP Coding Standard Verification testsuiteIsso executará o arquivo testsuite / Magento / Test / Php / LiveCodeTest.php

Ao abrir esse arquivo, você encontrará diferentes funções para verificar os diferentes tipos de problemas de código. A função que será executada é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
    );
}

Aqui, você encontrará um código que será usado para colocar na lista negra qualquer arquivo / pasta dessa verificação de código.

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

Esta foreachfunção irá procurar por qualquer .txtarquivo adicionado no local dev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist . Ele lerá o arquivo e ignorará todas as pastas a serem excluídas do processo de detecção de código de colar e copiar.

Depois de adicionar todos os arquivos / pastas da lista negra ao código, ele será executado abaixo do código.

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

Este código executará a runfunção do arquivo 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;
}

Aqui, o código adiciona todas as blacklistedpastas / arquivos na --excludelista.

Depois disso, ele executará o vendor/bin/phpcpdcomando.

Aqui no próprio comando Magento tem

excluiu todos os Testarquivos por código

--names-exclude "*Test.php" 

Ele também pulou todas as duplicatas de código com menos de 13 linhas por código

--min-lines 13

A saída para esta execução de comando será adicionada ao arquivo definido na testCopyPastefunção O nome do arquivo para a detecção de copiar e colar é phpcpd_report.xml, localizado no local dev / tests / static / report .

Após a execução bem-sucedida do comando, a saída será adicionada aos arquivos de relatório.

Jaimin Sutariya
fonte
Você pode sugerir qualquer solução para esta questão da duplicação de código - magento.stackexchange.com/q/191829/20064
Piyush
Olá @nikhil, você pode me dizer qual linha indica o erro como "Esta extensão contém código duplicado". em phpcpd_report.xml
Emipro Technologies Pvt. Ltd.