Magento 2: Esegui `setup: di: compile` ** solo ** un modulo specifico?


33

È possibile pre-generare codice per un modulo specifico? IE: posso generare tutto il codice nel sistema con

php bin/magento setup:di:compile

Tuttavia, ciò può richiedere molto tempo. Vorrei pre-generare solo i file per un modulo specifico.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Il problema specifico che sto cercando di risolvere è aggirare questo problema con alcuni plugin non riconosciuti nella modalità sviluppatore / predefinita.


Ho aggiornato la mia risposta dopo aver letto l'ultimo articolo "Domande aperte". La risposta diretta alla domanda è: no. Non è complesso da risolvere. Non è stato implementato perché non è mai stato ritenuto necessario.
Anton Kril,

sarebbe fantastico avere la possibilità di "compilare" su un modulo, farebbe risparmiare molto tempo durante il debug dei problemi nello sviluppo del modulo.
Karen Baker,

Risposte:


20

Risposta breve: No. Questo non è possibile con gli strumenti forniti con Magento ora.

Spiegazione: Dobbiamo distinguere la generazione e la compilazione del codice . Il compilatore fa entrambe le cose. Per entrambe le operazioni è necessario leggere la configurazione di tutti gli altri moduli magento, altrimenti il ​​loro output sarà errato o non pieno.

La compilazione per un modulo non ha senso, in quanto Magento non funzionerà con la configurazione compilata per un solo modulo.

La generazione di un modulo potrebbe avere senso, ma dovremo comunque leggere le firme della configurazione e del costruttore da tutti gli altri moduli installati. Senza di essa non tutto il codice potrebbe essere generato. Quindi tale operazione non sarebbe molto più veloce della compilazione completa. Potremmo pensarci, ma penso che il bug a cui hai fatto riferimento sarà corretto prima dell'implementazione del comando.


1
è un tale dolore dover ricompilare ogni volta che un nuovo argomento di iniezione di dipendenza viene aggiunto da qualche parte durante lo sviluppo, c'è un modo per bypassare completamente la generazione di codice durante lo sviluppo?
snez,

6
Non è necessario eseguire il compilatore durante lo sviluppo. Dovrai comunque cancellare la directory / generation se modifichi le firme del metodo, ma non è necessaria alcuna compilazione. La compilazione serve solo per passare alla produzione.
Anton Kril,

12

L' bin/magentoeseguibile di Magento è solo un componente di Symfony Console. Ciò significa che è possibile trovare il singolo file responsabile di un singolo comando. La denominazione è sempre la stessa, quindi per setup: di: compile puoi trovare DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Eseguirà sempre il exeucte()metodo, quindi è lì che dobbiamo guardare. In questa funzione, vedrai che $operationsè impostata una var, che viene riempita dal getOperationsConfiguration()metodo. Questo metodo sostanzialmente dice a DiCompileCommand cosa compilare.

La prima cosa che ho provato è restituire solo la parte del generatore del codice dell'applicazione, in questo modo;

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

È andato abbastanza bene, il tempo di compilazione è stato ridotto drasticamente;

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

Al contrario di;

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

Certo, questo era prevedibile dal momento che abbiamo tagliato un certo numero di cose. Ma non hai specificato quali file vuoi aver generato. Non tutti i file possono essere generati su una base per modulo, dal momento che, ad esempio, le classi di intercettazione possono dipendere da più moduli e quindi fornirebbero un output limitato di funzionalità se lo si eseguisse solo per un modulo.

Puoi trovare i generatori responsabili qui;

setup / src / Magento / Setup / modulo / Di / App / Task / Operazione /

Ogni classe ha un foreach in esso, che ti permetterà di aggiungere un if / else con un continuo saltare determinati moduli / percorsi. Forse sarebbe utile controllare la documentazione di Symfony Console Component Input Arguments su come inserire argomenti nel comando.


+1 per informazioni utili, ma ri: "Ma non hai specificato quali file vuoi generare". È tecnicamente corretto, ma implicito nella domanda è il desiderio di generare la modalità del mio modulo, e quindi qualsiasi codice aggiuntivo che deve essere generato perché l'ho usato nel mio modulo. Il mio obiettivo finale non è di dover compilare l'intero sistema solo perché sto lavorando su un modulo.
Alan Storm,

3

puoi riconoscere da

pacchetto> modulo> registration.php

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

e di correre

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

registration.php riconoscerà il modulo e completerà il tuo modulo personalizzato.

Spero che questo ti possa aiutare.


2
Informazioni utili, ma non quello che stavo cercando. Non è il contenuto statico che voglio compilare, è la generazione che viene eseguita quando si esegue setup: di: compilare. È una cosa diversa.
Alan Storm,

-3

Quando cambi il costruttore per la classe generata nella richiesta precedente, si interromperà. Se hai tali esigenze var/cache, elimina semplicemente var/generatione var/di(se esiste) e aggiorna la pagina. Assicurati che la modalità sia lo sviluppatore in cui stai lavorando.

(Non sto dicendo in questo modo che Magento non verrà compilato o generato base di codice, sì, lo farà. In questo modo, darà un po 'di sollievo eseguendo "setup: di: compilare" ogni volta che si apportano modifiche ai percorsi o alle classi)


Questo sembra rispondere a una domanda diversa.
Alan Storm,

La risposta è già stata data da Anton Kril sopra, che è molto semplice e logicamente vero. Ho appena provato a darti una soluzione alternativa che non ti avrebbe permesso di eseguire il comando e guardare il tuo schermo fino alla compilazione. In questo modo puoi risparmiare tempo. La risposta è praticamente correlata alla tua domanda. Se questo è il tuo atteggiamento, allora nessuno trova soluzioni e pensieri.
Laxman Singh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.