Magento 2: Lancez `setup: di: compile` ** seulement ** un module spécifique?

33

Est-il possible de pré-générer du code pour un module spécifique? IE - Je peux générer tout le code du système avec

php bin/magento setup:di:compile

Cependant, cela peut prendre beaucoup de temps. Je voudrais pré-générer uniquement les fichiers d'un module spécifique.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Le problème spécifique que j'essaie de résoudre est de contourner ce problème avec certains plugins non reconnus en mode développeur / par défaut.

Alan Storm
la source
Mise à jour de ma réponse après la lecture de votre dernier article "Questions ouvertes". La réponse directe à la question est: non. Ce n'est pas complexe à résoudre. Il n'a tout simplement pas été mis en œuvre car n'a jamais été considéré comme nécessaire.
Anton Kril
Ce serait formidable de pouvoir "compiler" un module, ce qui permettrait de gagner beaucoup de temps en cas de problèmes de débogage lors du développement de modules.
Karen Baker

Réponses:

20

Réponse courte: Non. Ce n'est pas possible avec les outils livrés avec Magento maintenant.

Explication: Nous devons distinguer la génération de code et la compilation . Le compilateur fait les deux. Pour les deux opérations, nous devons lire la configuration de tous les autres modules de magento, sinon leur sortie sera incorrecte ou incomplète.

Compiler pour un module n'a pas de sens, car magento ne fonctionnera pas avec la configuration compilée pour un seul module.

La génération pour un module peut sembler logique, mais nous devrons quand même lire les signatures de configuration et de constructeur de tous les autres modules installés. Sans cela, tout le code ne pourrait pas être généré. Donc, une telle opération ne serait pas beaucoup plus rapide qu'une compilation complète. Nous pourrions y penser, mais je pense que le bogue que vous avez mentionné sera corrigé avant que la commande ne soit implémentée.

Anton Kril
la source
1
C'est tellement pénible de devoir recompiler chaque fois qu'un nouvel argument d'injection de dépendance est ajouté quelque part pendant le développement, existe-t-il un moyen de contourner complètement la génération de code pendant le développement?
Snez
6
Vous n'avez jamais à exécuter le compilateur pendant le développement. Vous devrez toujours effacer le répertoire / génération si vous modifiez les signatures de méthode, mais aucune compilation n'est nécessaire. La compilation sert uniquement à passer en production.
Anton Kril
12

L' bin/magentoexécutable de Magento est juste un composant de la console Symfony. Cela signifie que vous pouvez trouver le fichier individuel responsable d’une seule commande. Le nom est toujours le même, donc pour setup: di: compile vous pouvez trouver DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

La exeucte()méthode sera toujours exécutée , c'est pourquoi nous devons l'examiner. Dans cette fonction, vous verrez qu'une $operationsvariable est définie, qui est remplie par la getOperationsConfiguration()méthode. Cette méthode indique à la DiCompileCommand quoi compiler.

La première chose que j'ai essayée est de ne renvoyer que la partie générateur de code d'application, comme ceci;

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

Cela s’est bien passé, le temps de compilation a été considérablement réduit;

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

Par opposition à;

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

Bien entendu, il fallait s'y attendre, car nous avons éliminé un certain nombre de choses. Mais vous ne l' avez pas spécifié que les fichiers que vous voulez avoir généré. Tous les fichiers ne peuvent pas être générés module par module car, par exemple, les classes d'interception peuvent dépendre de plusieurs modules et vous donneraient donc une sortie limitée de fonctionnalités si vous ne l'exécutiez que pour un module.

Vous pouvez trouver les générateurs responsables ici;

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

Chaque classe a une foreach, ce qui vous permettra d’ajouter un if / else avec un continuer à ignorer certains modules / chemins. Peut-être serait-il utile de consulter la documentation relative aux arguments d' entrée des composants de la console Symfony pour savoir comment introduire des arguments dans la commande.

Peter Jaap Blaakmeer
la source
+1 pour des informations utiles, mais re: "Mais vous n'avez pas spécifié les fichiers que vous voulez générer". C'est techniquement correct, mais implicite dans la question est le désir de générer le mode de mon module, puis tout code supplémentaire devant être généré car je l'ai utilisé dans mon module. Mon objectif final n’est pas de compiler l’ensemble du système simplement parce que je travaille sur un module.
Alan Storm
3

vous pouvez reconnaître par

package> module> registration.php

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

et que courir

Module php -f bin / magento: enable - module-paquet-paquet

registration.php reconnaîtra le module et complétera votre module personnalisé.

J'espère que cela t'aidera.

dénoncer vachhani
la source
2
Informations utiles, mais pas ce que je cherchais. Ce n'est pas du contenu statique que je veux compiler, c'est la génération qui s'exécute lorsque vous exécutez setup: di: compile. C'est une chose différente.
Alan Storm
-3

Lorsque vous modifiez votre constructeur pour la classe générée dans la requête précédente, il est cassé. Si vous avez de tels besoins var/cache, supprimez-les simplement var/generationet , le var/dicas échéant, actualisez la page. Assurez-vous que le mode est celui du développeur sur lequel vous travaillez.

(Je ne dis pas de cette façon que magento ne compilera ni ne générera de code, oui, il le fera. Faire ainsi, cela soulage un peu de lancer "setup: di: compile" chaque fois que vous modifiez vos itinéraires ou vos classes)

Laxman Singh
la source
Cela semble répondre à une question différente.
Alan Storm
La réponse a déjà été donnée par Anton Kril ci-dessus, c'est très simple et logiquement vrai. J'ai juste essayé de vous donner une solution alternative qui ne vous permettait pas de lancer des commandes et de regarder votre écran avant la compilation. En faisant cela, vous économiserez du temps. La réponse est à peu près liée à votre question. Si telle est votre attitude, personne ne propose de solutions ni de pensées.
Laxman Singh