Plik bin/magento
wykonywalny 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 $operations
var, 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.