Magento 2: Execute `setup: di: compile` ** apenas ** um Módulo Específico?

33

É possível pré-gerar código para um módulo específico? IE - eu posso gerar todo o código no sistema com

php bin/magento setup:di:compile

No entanto, isso pode levar muito tempo. Eu gostaria de gerar previamente apenas os arquivos para um módulo específico.

php bin/magento setup:di:compile Pulsestorm_Commercebug

O problema específico que estou tentando resolver está solucionando esse problema, com alguns plug-ins não reconhecidos no modo desenvolvedor / padrão.

Alan Storm
fonte
Atualizei minha resposta depois de ler o artigo mais recente "Perguntas abertas". A resposta direta à pergunta é: não. Não é complexo de resolver. Apenas não foi implementado porque nunca foi considerado necessário.
Anton Kril 08/02
seria ótimo obter a capacidade de 'compilar' em um módulo, economizaria muito tempo ao depurar problemas no desenvolvimento de módulos.
Karen Baker

Respostas:

20

Resposta curta: Não. Isso não é possível com as ferramentas enviadas com o Magento agora.

Explicação: Temos que distinguir a geração e compilação de código . O compilador faz as duas coisas. Para ambas as operações, precisamos ler a configuração de todos os outros módulos magento, caso contrário, sua saída estará incorreta ou não estará completa.

A compilação para um módulo não faz sentido, pois o magento não funcionará com a configuração compilada para apenas um módulo.

A geração para um módulo pode fazer sentido, mas teremos que ler assinaturas de configuração e construtor de todos os outros módulos instalados de qualquer maneira. Sem ele, nem todo o código pode ser gerado. Portanto, essa operação não seria muito mais rápida que a compilação completa. Podemos pensar nisso, mas acho que o bug que você referenciou será corrigido antes da implementação do comando.

Anton Kril
fonte
1
é uma pena ter que recompilar toda vez que um novo argumento de injeção de dependência é adicionado em algum lugar durante o desenvolvimento; existe uma maneira de ignorar completamente a geração de código durante o desenvolvimento?
snez
6
Você nunca precisa executar o compilador durante o desenvolvimento. Você ainda precisará limpar o diretório / generation se modificar as assinaturas do método, mas nenhuma compilação é necessária. A compilação é apenas para alternar para produção.
Anton Kril 30/01
12

O bin/magentoexecutável do Magento é apenas um componente do Symfony Console. Isso significa que você pode encontrar o arquivo individual responsável por um único comando. A nomeação é sempre a mesma; portanto, para setup: di: compile, você pode encontrar o DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Ele sempre executa o exeucte()método, e é aí que precisamos procurar. Nesta função, você verá um $operationsvar definido, preenchido pelo getOperationsConfiguration()método Esse método basicamente diz ao DiCompileCommand o que compilar.

A primeira coisa que tentei é retornar apenas a parte do gerador de código do aplicativo;

private function getOperationsConfiguration(
    array $compiledPathsList
) {
    $excludePatterns = [];
    foreach ($this->excludedPathsList as $excludedPaths) {
        $excludePatterns = array_merge($excludedPaths, $excludePatterns);
    }

    return [
        OperationFactory::APPLICATION_CODE_GENERATOR => [
            'paths' => [
                $compiledPathsList['application'],
                $compiledPathsList['library'],
                $compiledPathsList['generated_helpers'],
            ],
            'filePatterns' => ['php' => '/\.php$/'],
            'excludePatterns' => $excludePatterns,
        ]
    ];
}

Isso correu muito bem, o tempo de compilação foi reduzido drasticamente;

Compilation was started.
Application code generator... 1/1 [============================] 100% 45 secs 308.8 MiB
Generated code and dependency injection configuration successfully.

Ao contrário de;

Compilation was started.
Interception cache generation... 7/7 [============================] 100% 3 mins 377.0 MiBB8 MiB
Generated code and dependency injection configuration successfully.

Obviamente, isso era de se esperar, já que cortamos várias coisas. Mas você não especificou quais arquivos você deseja gerar. Nem todos os arquivos podem ser gerados por módulo, pois, por exemplo, as classes de interceptação podem depender de vários módulos e, portanto, forneceriam uma saída limitada de funcionalidade se você o executasse apenas para um módulo.

Você pode encontrar os geradores responsáveis ​​aqui;

setup / src / Magento / Setup / Module / Di / App / Task / Operation /

Cada classe possui um foreach, o que permitirá que você adicione um if / else com uma continuação para pular certos módulos / caminhos. Talvez seja útil verificar a documentação dos Argumentos de entrada de componentes do Symfony Console sobre como alimentar argumentos no comando.

Peter Jaap Blaakmeer
fonte
+1 para obter informações úteis, mas re: "Mas você não especificou quais arquivos deseja gerar". Isso é tecnicamente correto, mas implícito na pergunta está o desejo de gerar o modo do meu módulo e, em seguida, qualquer código adicional que precise ser gerado porque eu o usei no meu módulo. Meu objetivo final não é precisar compilar o sistema inteiro apenas porque estou trabalhando em um módulo.
Alan Storm
3

você pode reconhecer por

pacote> módulo> registration.php

<?php
use \Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Package_Module', __DIR__);

e do que correr

php -f bin / magento module: enable --clear-static-content Package_Module

registration.php reconhecerá o módulo e completará seu módulo personalizado.

Eu espero que isso te ajude.

negar vachhani
fonte
2
Informações úteis, mas não o que eu estava procurando. Não é um conteúdo estático que eu quero compilar, é a geração que é executada quando você executa o setup: di: compile. Isso é diferente.
Alan Storm
-3

Quando você altera seu construtor para a classe que foi gerada na solicitação anterior, ele será interrompido. Se você estiver em tais necessidades simplesmente apagar var/cache, var/generatione var/di(se existir) e atualizar a página. Verifique se o modo é o desenvolvedor em que você está trabalhando.

(Não estou dizendo desta maneira que o magento não compilará ou gerará uma base de código, sim, sim. Dessa maneira, ajuda a executar "setup: di: compile" toda vez que você fizer alterações em suas rotas ou classes)

Laxman Singh
fonte
Isso parece estar respondendo a uma pergunta diferente.
Alan Storm
A resposta já foi dada por Anton Kril acima, isso é muito claro e logicamente verdadeiro. Eu apenas tentei fornecer uma solução alternativa que não permitisse executar o comando e assistir a sua tela até a compilação. Desta forma, você pode economizar seu tempo. A resposta está praticamente relacionada à sua pergunta. Se essa é a sua atitude, ninguém apresenta soluções e pensamentos.
Laxman Singh