Magento 2: Führen Sie `setup: di: compile` ** nur ** ein bestimmtes Modul aus?

33

Ist es möglich, Code für ein bestimmtes Modul vorab zu generieren? IE - Ich kann den gesamten Code im System mit erzeugen

php bin/magento setup:di:compile

Dies kann jedoch lange dauern. Ich möchte nur die Dateien für ein bestimmtes Modul vorab generieren .

php bin/magento setup:di:compile Pulsestorm_Commercebug

Das spezifische Problem, das ich zu lösen versuche, besteht darin, dieses Problem zu umgehen, indem einige Plugins im Entwickler- / Standardmodus nicht erkannt werden.

Alan Storm
quelle
Meine Antwort wurde aktualisiert, nachdem Sie Ihren neuesten Artikel "Offene Fragen" gelesen haben. Die direkte Antwort auf die Frage lautet: nein. Es ist nicht kompliziert zu lösen. Es wurde einfach nicht implementiert, weil es nie als notwendig angesehen wurde.
Anton Kril
Es wäre großartig, wenn Sie die Möglichkeit hätten, ein Modul zu 'kompilieren'. Dies würde beim Debuggen von Problemen in der Modulentwicklung viel Zeit sparen.
Karen Baker

Antworten:

20

Kurze Antwort: Nein. Dies ist mit den mit Magento gelieferten Werkzeugen derzeit nicht möglich.

Erklärung: Wir müssen unterscheiden Codegenerierung und Kompilierung unterscheiden . Der Compiler macht beides. Für beide Operationen müssen wir die Konfiguration aller anderen Magento-Module lesen, sonst ist ihre Ausgabe falsch oder nicht voll.

Das Kompilieren für ein Modul ist nicht sinnvoll, da Magento nicht mit kompilierten Konfigurationen für nur ein Modul funktioniert.

Die Generierung für ein Modul mag sinnvoll sein, aber wir müssen trotzdem die Konfigurations- und Konstruktorsignaturen aller anderen installierten Module lesen. Andernfalls wird möglicherweise nicht der gesamte Code generiert. Eine solche Operation wäre also nicht viel schneller als die vollständige Kompilierung. Wir könnten daran denken, aber ich denke, der Fehler, auf den Sie verwiesen haben, wird behoben, bevor der Befehl implementiert wird.

Anton Kril
quelle
1
Es ist so schmerzhaft, jedes Mal neu kompilieren zu müssen, wenn irgendwo während der Entwicklung ein neues Argument für die Abhängigkeitsinjektion hinzugefügt wird. Gibt es eine Möglichkeit, die Codegenerierung während der Entwicklung vollständig zu umgehen?
Snez
6
Sie müssen den Compiler niemals während der Entwicklung ausführen. Sie müssen weiterhin das Verzeichnis / generation löschen, wenn Sie Methodensignaturen ändern, es ist jedoch keine Kompilierung erforderlich. Die Zusammenstellung dient nur der Umstellung auf die Produktion.
Anton Kril
12

Magento bin/magento ausführbare Datei ist nur eine Symfony Console-Komponente. Dies bedeutet, dass Sie die einzelne Datei für einen einzelnen Befehl als verantwortlich ansehen können. Die Benennung ist immer gleich, so dass Sie für setup: di: compile die Datei DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php) finden können.

Die exeucte()Methode wird immer ausgeführt , daher müssen wir genau danach suchen. In dieser Funktion sehen Sie ein$operations Variable gesetzt, die von der getOperationsConfiguration()Methode gefüllt wird . Diese Methode teilt dem DiCompileCommand grundsätzlich mit, was kompiliert werden soll.

Das erste, was ich versucht habe, ist, nur den Teil des Anwendungscode-Generators wie folgt zurückzugeben.

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

Das lief ziemlich gut, die Kompilierungszeit wurde drastisch verkürzt;

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

Im Gegensatz zu;

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

Dies war natürlich zu erwarten, da wir eine Reihe von Dingen herausgeschnitten haben. Aber Sie haben nicht angegeben welche Dateien Sie generieren möchten. Nicht alle Dateien können auf Modulbasis generiert werden, da die Interception-Klassen beispielsweise von mehreren Modulen abhängig sein können und daher nur eine eingeschränkte Funktionsausgabe bieten, wenn Sie dies nur für ein Modul ausführen würden.

Die verantwortlichen Generatoren finden Sie hier;

setup / src / Magento / Setup / Modul / Di / App / Task / Betrieb /

In jeder Klasse gibt es ein foreach, mit dem Sie ein if / else hinzufügen können, mit dem Sie bestimmte Module / Pfade überspringen können. Vielleicht ist es hilfreich, die Dokumentation zu den Symfony Console-Komponenten-Eingabeargumenten zu lesen, um zu erfahren, wie Argumente in den Befehl eingegeben werden.

Peter Jaap Blaakmeer
quelle
+1 für nützliche Informationen, aber zu "Sie haben nicht angegeben, welche Dateien Sie generieren möchten". Das ist technisch korrekt, aber die Frage impliziert den Wunsch, den Modus meines Moduls zu generieren und dann jeden zusätzlichen Code, der generiert werden muss, weil ich ihn in meinem Modul verwendet habe. Mein Endziel ist es nicht, das gesamte System kompilieren zu müssen, nur weil ich an einem Modul arbeite.
Alan Storm
3

Sie können durch erkennen

package> module> registration.php

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

und dann rennen

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

registration.php erkennt das Modul und ergänzt Ihr benutzerdefiniertes Modul.

Ich hoffe, dies wird dir helfen.

leugnen vachhani
quelle
2
Nützliche Informationen, aber nicht das, wonach ich gesucht habe. Es handelt sich nicht um statischen Inhalt, den ich kompilieren möchte, sondern um die Generation, die ausgeführt wird, wenn Sie setup: di: compile ausführen. Das ist eine andere Sache.
Alan Storm
-3

Wenn Sie Ihren Konstruktor für die Klasse ändern, die in der vorherigen Anforderung generiert wurde, wird dies nicht mehr funktionieren. Wenn Sie in solchen Bedürfnissen sind, löschen Sie einfach var/cache, var/generationundvar/di (falls vorhanden) und die Seite aktualisieren. Stellen Sie sicher, dass es sich bei dem Modus um den Entwickler handelt, in dem Sie arbeiten.

(Ich sage nicht auf diese Weise, dass Magento keine Codebasis kompiliert oder generiert, ja, das wird es. Auf diese Weise erleichtert es das Ausführen von "setup: di: compile" jedes Mal, wenn Sie Änderungen an Ihren Routen oder Klassen vornehmen.)

Laxman Singh
quelle
Dies scheint eine andere Frage zu beantworten.
Alan Storm
Die Antwort wurde bereits von Anton Kril oben gegeben, das ist sehr klar und logisch richtig. Ich habe nur versucht, Ihnen eine alternative Lösung zu bieten, mit der Sie den Befehl nicht ausführen und Ihren Bildschirm bis zum Kompilierungslauf beobachten können. Auf diese Weise können Sie Ihre Zeit sparen. Die Antwort hat ziemlich viel mit Ihrer Frage zu tun. Wenn dies Ihre Einstellung ist, dann kommt niemand mit Lösungen und Gedanken.
Laxman Singh