Я создаю пользовательский модуль в Drupal 8. Он включает в себя некоторые файлы конфигурации YAML.
По мере разработки мне нужно изменить и добавить в конфигурацию, например, добавить еще одно поле в мой пользовательский объект.
В настоящее время единственный способ заставить Drupal заметить изменения - это удалить модуль и переустановить его.
Есть ли способ заставить Drupal проверить, что файлы конфигурации, предоставляемые модулями, совпадают с активной конфигурацией, и если нет, обновить активную конфигурацию? Как обрабатываются обновления модуля? В D7 hook_update_N
будет использоваться для добавления полей с использованием PHP, но, похоже, это должно быть обработано CM в D8?
Вещи, которые я пробовал после обновления файлов yml в модуле:
drush cr
Конфигурация синхронизации.вручную скопируйте все обновленные файлы конфигурации в файл,
sites/default/files/config_XXX/staging/
но это приводит к этой ошибке: «Этапная конфигурация не может быть импортирована, поскольку она создается с сайта, отличного от этого сайта. Вы можете синхронизировать конфигурацию только между клонированными экземплярами этого сайта». ,вручную импортируйте файлы по одному с помощью менеджера конфигурации. Это работает, но, очевидно, должен быть более автоматический путь.
[EDIT] вручную использует модуль config_update для проверки изменений и «возврата» к конфигурации модуля. Опять же, это руководство.
РЕДАКТИРОВАТЬ: Из управления конфигурацией - делать и не делать
НЕЛЬЗЯ
Попробуйте изменить активную конфигурацию на вашем сайте, изменив файлы в каталоге config / install модуля. Это НЕ будет работать, потому что Drupal будет читать только из этого каталога, когда модуль установлен.
... но изменения там собираются произойти, если модули не связаны с любой конфиг они нуждались в их первый когда - либо отпустить, и никогда не может когда - либо обновления или добавления конфигурации.
Заранее спасибо.
источник
hook_update_N
я бы предположил, но я не уверен, чтоhook_update_N
. Отличная статья о Drupal 8 для небольших сайтов (и часть 2 ). В D8 «сайты имеют свою конфигурацию, а не модули» .Ответы:
Как уже упоминалось в первоначальном вопросе и последующих комментариях, для достижения этой цели существует множество модулей contrib и ручных методов.
Делать это автоматически или по
hook_update_N()
своему усмотрению , я думаю, по-прежнему, вероятно, самый жизнеспособный вариант.Например, это пример из Head 2 Head для обновления,
system.site
чтобы установитьdefault_langcode
:Вы также можете прочитать в конфигурации (рекомендуется только для добавления новой конфигурации, не обязательно обновления или переопределения конфигурации, которая могла быть настроена):
где
$path
абсолютный путь кmy_config.foo.yml
файлу.источник
Поскольку я тоже нашел этот вопрос, но не нашел здесь правильного ответа для своей ситуации, я хотел бы добавить еще один ответ.
Обратите внимание: анти-паттерн впереди!
Случай использования
Когда мы разрабатываем проекты, мы постоянно обновляем нашу среду тестирования / принятия новыми обновлениями конфигурации. Возьмем, к примеру, простой вымышленный модуль новостей, мы хотели бы добавить тип контента в модуль и развернуть его в нашей среде принятия. После проверки мы пришли к выводу, что пропало несколько полей и другие вещи, связанные с конфигурацией. Поскольку мы знаем, что среда принятия не обновляется в конфигурации, мы действительно хотим перезагрузить всю конфигурацию из модуля, в то время как добавлены новые функциональные возможности, и не беспокоиться об импорте каждого измененного
.yml
файла.Нам нужен только наш конфиг в модулях, когда мы разрабатываем мультисайты. Для отдельных сайтов мы в основном просто используем экспортированную конфигурацию сайта, в которой следующий шаг не нужен.
Повторно импортируйте конфигурацию полностью (анти-шаблон!)
Мы обнаружили, что с помощью службы ConfigInstaller мы можем снова импортировать полную конфигурацию из определенного модуля.
Используйте с осторожностью!
Я хотел бы добавить, что это перезапишет любой активный контент, который был изменен в среде. Поэтому используйте это решение только тогда, когда вы уверены, что можно перезаписать активную конфигурацию. Мы никогда не будем использовать это в производственной среде и будем применять только на ранних этапах разработки.
Сначала попробуйте решение @ jhedstrom, прежде чем приступить к рассмотрению этого.
источник
Я нашел этот Gist на GitHub, который возвращает / перезагружает данную конфигурацию модуля, используя drush:
источник
На основании моего комментария: Как мне обновить конфигурацию модуля?
Я создал небольшую функцию, которая помогает мне в этом, вот мой пример кода:
источник
Ответ выше (полный повторный импорт) работал и для моего варианта использования, но сначала я потратил немного времени на поиск более избирательного повторного импорта. Вот код, который у меня был, который, казалось, работал как хук обновления и был основан на коде в модуле config_update:
источник
Модуль Synchronizer конфигурации помогает решить эту проблему хорошим способом. Этот набор модулей из 7 модулей кажется немного излишним только для этого случая (его целью является в основном безопасное объединение обновлений без перезаписи настроек), но благодаря своей концепции он также позволяет отслеживать и импортировать изменения конфигурации из модуля / установки и / дополнительные папки быстро.
По сути, вы можете проверить это следующим образом:
Примечание: если вы только хотите использовать config_sync для ускорения импорта конфигурации в процессе разработки модуля (и вы не заботитесь о слиянии с использованием клиентских обновлений), этого достаточно , чтобы установил этот набор и доступен только на локальные (развитие) средах ( при условии, что ваш модуль перейдет в более высокие среды после завершения, и вы используете управление конфигурацией ядра D8 для публикации его конфигурации в более высоких средах).
источник