Рейтинг:0

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

флаг hk

Кажется, я сталкиваюсь с проблемой круговой зависимости в сценарии, когда моя новая сборка имеет новый модуль (B), новый код в существующем модуле (A), который зависит от нового модуля (B) и новой конфигурации, импортируемой для новый модуль (В).

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

Есть ли лучший способ справиться с этим?

Изменение в модуле A заключается в том, что одна из служб в модуле A требует службы из модуля B.

Я уже добавил зависимость к новому модулю B в файле module_A.info.yml, но это не помогает, так как модуль уже установлен.

drush en module_b не работает и выдает ошибку.

Служба "module_A_service" зависит от несуществующей службы "module_B_service".

Импорт конфигурации, который находится в сборке, обновлен core.extensions, чтобы включить module_B, когда он импортируется, но импорт конфигурации с драш цим не работает с той же ошибкой, что и выше.

флаг id
Я сделал то, что вы сделали. Вы также можете подумать об обнаружении другого модуля или службы и вернуться к некоторому базовому поведению.
флаг cn
Похоже, вы хотите добавить `hook_update_N` в модуль_A для установки модуля_B.
флаг hk
Спасибо за ответы @cilefen Разве зависимости службы не сложны в том, как зависимости добавляются в файлы yml?
флаг hk
Спасибо за ответ @Clive - я не пробовал это явно, но я попробовал drush php eval для \Drupal::service('module_installer')->install(['module_b']);. Это дало ту же ошибку. Будет ли он вести себя по-другому в hook_update. Я мог бы попробовать и это.
Jaypan avatar
флаг de
Ошибка указывает на то, что ваша служба A имеет несуществующую зависимость, которая не является циклической зависимостью. В чем ошибка, если вы развернете все в один коммит, а не разделите его на два?
флаг hk
Спасибо за ваш ответ @Jaypan. drush cr не работает с указанной выше ошибкой. drush cim также не работает с той же ошибкой. drush updb запускается, но показывает ту же ошибку. Я не развертываю это в нескольких сборках. Я развертываю в одной сборке. Я имел в виду, что я обычно решаю эту проблему с помощью двух сборок и пытаюсь выяснить, что было бы хорошим способом решить эту проблему в одной сборке.
Jaypan avatar
флаг de
Если это из одного развертывания, попробуйте использовать Drush, чтобы сначала включить модуль B, а затем запустить `drush updb`.
флаг hk
drush en module_b не работал с той же ошибкой, что и выше. Однако я пошел дальше и добавил обновление хука с помощью \Drupal::service('module_installer')->install(['module_b']); как то, что предложил @Clive. Он прошел без ошибок и установил модуль. Таким образом, решение состоит в том, чтобы добавить обновление ловушки, чтобы явно включить зависимый модуль, даже если в сборке есть конфигурация для включения модуля позже.
флаг cn
Я думаю, что `updb` действительно работает в другом режиме начальной загрузки, поэтому стоит попробовать, если вы можете сначала протестировать (просто вытащите DB/общедоступные файлы и запустите их локально, чтобы вы могли это сделать). Я почти уверен, что делал именно это раньше, чтобы решить ту же проблему. Возможно, не стоит выполнять `drush cr` перед `updb`, чтобы у системы не было возможности перестроить кеш плагина, пока модуль не будет включен.
флаг hk
Спасибо @Clive. Это помогло.
Рейтинг:1
флаг hk

Это решение, которое сработало

а) Реализуйте hook_update_N в уже установленном модуле A.В hook_update_N добавьте код для установки module_b. Включите это в ту же сборку.

функциональный модуль_a_update_NNNN(&$песочница) {
  $module_installer = \Drupal::service('module_installer');
  $module_handler = \Drupal::service('module_handler');
  если (!$module_handler->moduleExists('module_b')) {
    $module_installer->install(['module_b']);
  }
}

б) Развернуть сборку

в) Не очищать кеш. Если вы запустите очистку кеша перед updb, он выдаст ту же ошибку, что и в вопросе.

г) Бежать драш updb

д) Бежать драш цим

е) Бежать драш кр

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.