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. Це означає, що ви можете знайти окремий файл, відповідальний за одну команду. Ім'я завжди однакове, тому для настройки: di: compile ви можете знайти DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Він завжди буде запускати exeucte()метод, тому саме там нам потрібно шукати. У цій функції ви побачите встановлений $operationsvar, який заповнюється 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.

Звичайно, цього можна було очікувати, оскільки ми вирізали ряд речей. Але ви не вказали, які файли потрібно створити. Не всі файли можна генерувати на основі модулів, оскільки, наприклад, класи перехоплення можуть залежати від декількох модулів і тому дають вам обмежений вихід функціональних можливостей, якщо ви запускаєте це лише для одного модуля.

Ви можете знайти відповідальних генераторів тут;

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

У кожному класі є передбачення, що дозволить вам додати if / else з продовженням пропускання певних модулів / контурів. Можливо, було б корисно ознайомитись із документацією на вхідні аргументи компонента консолі Symfony про те, як подавати аргументи в команду.


+1 для корисної інформації, але повторно: "Але ви не вказали, які файли потрібно створити". Це технічно правильно, але в питанні мається на увазі бажання створити режим мого модуля, а потім будь-який додатковий код, який потрібно створити, оскільки я його використовував у своєму модулі. Моя кінцева мета - не потрібно складати всю систему лише тому, що я працюю над одним модулем.
Алан Шторм

3

ви можете впізнати за

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

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

і чим бігати

php -f bin / magento module: enable - ядерно-статичний вміст Package_Module

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

Я сподіваюся, що це вам допоможе.


2
Корисна інформація, але не те, що я шукав. Я не хочу статичний вміст, який я збираю, це покоління, яке працює під час запуску setup: di: compile. Це різна річ.
Алан Шторм

-3

При зміні конструктора для класу, який був сформований у попередньому запиті, він порушиться. Якщо ви перебуваєте в таких потребах просто видалити var/cache, var/generationі var/di(якщо є) і обновіть сторінку. Переконайтесь, що режим - це розробник, у якому ви працюєте.

(Я не кажу, що таким чином magento не буде компілювати чи генерувати кодову базу, так, це буде. Це робиться таким чином, полегшує запуск "setup: di: compile" щоразу, коли ви вносите зміни у свої маршрути чи класи)


Це, здається, відповідає на інше питання.
Алан Шторм

Відповідь Антон Криль вже дав вище, це дуже прямо і логічно вірно. Я просто спробував дати вам альтернативне рішення, яке б не дало вам запустити команду і спостерігати за екраном до запуску компіляції. Таким чином ви можете заощадити свій час. Відповідь в значній мірі пов'язана з вашим запитанням. Якщо це ваше ставлення, тоді ніхто не придумує рішення та думки.
Лаксман Сінгх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.