Magento 2: Запустить `setup: di: compile` ** ** ** определенный модуль?

33

Можно ли предварительно сгенерировать код для одного конкретного модуля? IE - я могу сгенерировать весь код в системе с

php bin/magento setup:di:compile

Однако это может занять много времени. Я хотел бы предварительно сгенерировать только файлы для конкретного модуля.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Конкретная проблема, которую я пытаюсь решить, заключается в том, чтобы обойти эту проблему, когда некоторые плагины не распознаются в режиме разработчика / по умолчанию.

Алан Сторм
источник
Обновил мой ответ после прочтения вашей последней статьи "Открытые вопросы". Прямой ответ на вопрос: нет. Это не сложно решить. Это просто не было реализовано, потому что никогда не считалось необходимым.
Антон Крыль,
было бы здорово получить возможность «компилировать» на одном модуле, сэкономило бы много времени при отладке проблем при разработке модулей.
Карен Бейкер

Ответы:

20

Краткий ответ: Нет. Это невозможно с инструментами, поставляемыми с Magento сейчас.

Пояснение: мы должны различать генерацию и компиляцию кода . Компилятор делает оба. Для обеих операций нам нужно прочитать конфигурацию всех остальных модулей magento, иначе их вывод будет неправильным или не полным.

Компиляция для одного модуля не имеет смысла, так как magento не будет работать с скомпилированной конфигурацией только для одного модуля.

Генерация для одного модуля может иметь смысл, но нам все равно придется считывать сигнатуры конфигурации и конструктора со всех других установленных модулей. Без этого не весь код может быть сгенерирован. Так что такая операция не будет намного быстрее, чем полная компиляция. Мы могли бы подумать об этом, но я думаю, что ошибка, на которую вы ссылались, будет исправлена ​​до того, как команда будет реализована.

Антон Криль
источник
1
Это такая боль, что приходится перекомпилировать каждый раз, когда во время разработки добавляется новый аргумент внедрения зависимости, есть ли способ полностью обойти генерацию кода во время разработки?
snez
6
Вам никогда не придется запускать компилятор во время разработки. Вам все равно придется очистить / каталог генерации, если вы измените сигнатуры методов, но компиляция не требуется. Сборник только для перехода на производство.
Антон
12

bin/magentoИсполняемый файл Magento - это просто компонент Symfony Console. Это означает, что вы можете найти отдельный файл, отвечающий за одну команду. Наименование всегда одинаковое, поэтому для настройки: di: compile вы можете найти DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Он всегда будет запускать exeucte()метод, так что нам нужно посмотреть. В этой функции вы увидите, что $operationsпеременная установлена, которая заполняется getOperationsConfiguration()методом. Этот метод в основном сообщает DiCompileCommand, что компилировать.

Первое, что я попробовал, это вернуть только часть генератора кода приложения, вот так;

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

Это прошло довольно хорошо, время компиляции было значительно сокращено;

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

В отличие от;

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

Конечно, этого следовало ожидать, так как мы вырезали несколько вещей. Но вы не указали, какие файлы вы хотите сгенерировать. Не все файлы могут быть сгенерированы для каждого модуля, так как, например, классы перехвата могут зависеть от нескольких модулей и, следовательно, могут дать вам ограниченный вывод функциональности, если вы запустите это только для одного модуля.

Вы можете найти ответственных генераторов здесь;

Настройка / SRC / Magento / Setup / модуль / Di / App / Task / Работа /

В каждом классе есть foreach, который позволит вам добавить if / else с оператором continue, пропускающим определенные модули / пути. Возможно, было бы полезно ознакомиться с документацией Symfony Console Component Input Arguments о том, как вводить аргументы в команду.

Питер Яап Блакмер
источник
+1 за полезную информацию, но повторяю: «Но вы не указали, какие файлы вы хотите сгенерировать». Это технически правильно, но в этом вопросе подразумевается желание сгенерировать режим моего модуля, а затем любой дополнительный код, который необходимо сгенерировать, потому что я использовал его в своем модуле. Моя конечная цель - не нужно компилировать всю систему только потому, что я работаю над одним модулем.
Алан Сторм
3

вы можете узнать по

пакет> модуль> registration.php

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

и чем бежать

Модуль php -f bin / magento: включить --clear-static-content Package_Module

registration.php распознает модуль и скомпилирует ваш пользовательский модуль.

Я надеюсь, что это поможет вам.

дениш вачхани
источник
2
Полезная информация, но не то, что я искал. Это не статический контент, который я хочу скомпилировать, это поколение, которое запускается при запуске setup: di: compile. Это другая вещь.
Алан Сторм
-3

Когда вы измените свой конструктор для класса, который был сгенерирован в предыдущем запросе, он сломается. Если вы в таких потребностях просто удалите var/cache, var/generationиvar/di (если есть) и обновите страницу. Убедитесь, что режим является разработчиком, в котором вы работаете.

(Я не говорю, что magento не будет компилировать или генерировать кодовую базу, да, так и будет. Делая так, это немного облегчает запуск «setup: di: compile» каждый раз, когда вы вносите изменения в свои маршруты или классы)

Лаксман Сингх
источник
Кажется, это ответ на другой вопрос.
Алан Сторм
Ответ уже дал Антон Криль выше, это очень прямо и логически верно. Я просто попытался дать вам альтернативное решение, которое не позволяло бы вам запускать команды и смотреть на экран до запуска компиляции. Делая так, вы можете сэкономить свое время. Ответ в значительной степени связан с вашим вопросом. Если это ваше отношение, то никто не придумывает решения и мысли.
Лаксман Сингх