Magento 2: Uruchom `setup: di: compile` ** tylko ** określony moduł?

33

Czy można wstępnie wygenerować kod dla jednego określonego modułu? IE - mogę wygenerować cały kod w systemie za pomocą

php bin/magento setup:di:compile

Może to jednak zająć dużo czasu. Chciałbym wstępnie wygenerować tylko pliki dla określonego modułu.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Konkretnym problemem, który próbuję rozwiązać, jest obejście tego problemu, ponieważ niektóre wtyczki nie są rozpoznawane w trybie programisty / domyślnym.

Alan Storm
źródło
Zaktualizowałem moją odpowiedź po przeczytaniu ostatniego artykułu „Otwarte pytania”. Bezpośrednia odpowiedź na pytanie brzmi: nie. Rozwiązanie nie jest skomplikowane. Po prostu nie został wdrożony, ponieważ nigdy nie był uważany za potrzebny.
Anton Kril
świetnie byłoby uzyskać możliwość „kompilacji” jednego modułu, zaoszczędziłoby to dużo czasu podczas debugowania problemów w rozwoju modułu.
Karen Baker,

Odpowiedzi:

20

Krótka odpowiedź: Nie. Nie jest to obecnie możliwe w przypadku narzędzi dostarczanych z Magento.

Objaśnienie: Musimy rozróżnić generowanie i kompilację kodu . Kompilator robi obie rzeczy. Dla obu operacji musimy odczytać konfigurację wszystkich innych modułów Magento, w przeciwnym razie ich dane wyjściowe będą niepoprawne lub niepełne.

Kompilacja dla jednego modułu nie ma sensu, ponieważ magento nie będzie działać ze skompilowaną konfiguracją tylko dla jednego modułu.

Generowanie dla jednego modułu może mieć sens, ale i tak będziemy musieli odczytać podpisy konfiguracji i konstruktora ze wszystkich innych zainstalowanych modułów. Bez tego nie można wygenerować całego kodu. Tak więc taka operacja nie byłaby dużo szybsza niż pełna kompilacja. Możemy o tym myśleć, ale myślę, że wskazany błąd zostanie naprawiony przed wykonaniem polecenia.

Anton Kril
źródło
1
to taki ból, że trzeba rekompilować za każdym razem, gdy gdzieś podczas programowania dodawany jest nowy argument wstrzykiwania zależności, czy istnieje sposób na całkowite pominięcie generowania kodu podczas programowania?
snez
6
Nigdy nie musisz uruchamiać kompilatora podczas programowania. Nadal będziesz musiał wyczyścić katalog / generation, jeśli zmodyfikujesz podpisy metod, ale kompilacja nie jest potrzebna. Kompilacja służy wyłącznie do przejścia na produkcję.
Anton Kril,
12

Plik bin/magentowykonywalny Magento to tylko komponent konsoli Symfony. Oznacza to, że możesz znaleźć pojedynczy plik odpowiedzialny za jedno polecenie. Nazewnictwo jest zawsze takie samo, więc dla setup: di: compile można znaleźć DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Zawsze będzie uruchamiał exeucte()metodę, więc tam musimy szukać. W tej funkcji zobaczysz ustawiony $operationsvar, który jest wypełniany przez getOperationsConfiguration()metodę. Ta metoda w zasadzie mówi DiCompileCommand, co należy skompilować.

Pierwszą rzeczą, którą próbowałem, jest zwrócenie tylko części generatora kodu aplikacji;

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

Poszło całkiem nieźle, czas kompilacji został znacznie skrócony;

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

W przeciwieństwie do;

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

Oczywiście należało się tego spodziewać, ponieważ wycięliśmy wiele rzeczy. Ale nie określiłeś, które pliki chcesz wygenerować. Nie wszystkie pliki mogą być generowane dla poszczególnych modułów, ponieważ na przykład klasy przechwytywania mogą być zależne od wielu modułów i dlatego zapewniłyby ograniczone możliwości działania, gdybyś uruchomił to tylko dla jednego modułu.

Tutaj znajdziesz odpowiedzialne generatory;

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

Każda klasa ma foreach, który pozwoli ci dodać if / else z pominięciem niektórych modułów / ścieżek. Może warto sprawdzić dokumentację argumentów wejściowych komponentów konsoli Symfony dotyczącą sposobu wprowadzania argumentów do polecenia.

Peter Jaap Blaakmeer
źródło
+1 za przydatne informacje, ale o: „Ale nie określiłeś, które pliki chcesz wygenerować”. Jest to technicznie poprawne, ale ukryte w pytaniu jest chęć wygenerowania trybu mojego modułu, a następnie każdego dodatkowego kodu, który należy wygenerować, ponieważ użyłem go w moim module. Moim celem końcowym nie jest konieczność kompilacji całego systemu tylko dlatego, że pracuję na jednym module.
Alan Storm,
3

możesz rozpoznać po

pakiet> moduł> rejestracja.php

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

i niż biegać

moduł php -f bin / magento: enable --clear-static-content Moduł_pakietu

Registration.php rozpozna moduł i skompiluje moduł niestandardowy.

Mam nadzieję, że to Ci pomoże.

denish vachhani
źródło
2
Przydatne informacje, ale nie to, czego szukałem. To nie jest statyczna zawartość, którą chcę skompilować, to generacja, która działa po uruchomieniu setup: di: compile. To inna sprawa.
Alan Storm,
-3

Zmiana konstruktora dla klasy wygenerowanej w poprzednim żądaniu spowoduje uszkodzenie. Jeśli jesteś w takich potrzebach, po prostu usuńvar/cache , var/generationi var/di(jeśli istnieje) i odśwież stronę. Upewnij się, że tryb jest programistą, w którym pracujesz.

(Nie mówię w ten sposób, że magento nie będzie kompilować ani generować bazy kodu, tak, zrobi to. W ten sposób daje pewną ulgę przy uruchamianiu „setup: di: compile” za każdym razem, gdy wprowadzasz zmiany w swoich trasach lub klasach)

Laxman Singh
źródło
To wydaje się odpowiadać na inne pytanie.
Alan Storm
Odpowiedź została już udzielona przez Antona Krila powyżej, jest to bardzo prosta i logicznie prawdziwa. Właśnie próbowałem dać ci alternatywne rozwiązanie, które nie pozwoliłoby ci uruchomić polecenia i obserwować ekranu, dopóki kompilacja nie zostanie uruchomiona. W ten sposób możesz zaoszczędzić czas. Odpowiedź jest w dużej mierze związana z twoim pytaniem. Jeśli takie jest twoje podejście, nikt nie wymyśli rozwiązań i myśli.
Laxman Singh,