Задача модуля — дать возможность разделить конфигурации сайта для разных системных окружений. На локальном сервере вы можете использовать такие модули как devel, stage_file_proxy, различные UI модули администрирования (вроде views_ui). А на prod сервере вам они не нужны.
Понятно, что если вы используете одну и ту же конфигурацию для всех системных окружений, то это создаёт определенные неудобства. Config Split помогает их решить.
Список конфигураций
Работа начинается с настройки списка конфигураций. «Промышленный» стандарт — это 4 конфигурации: local, dev, stage, prod. В простых случаях это может быть пара: local и prod.
/admin/config/development/configuration/config-split
Сплит-конфигурации работают как дополнение к основной конфигурации. Во время операций импорта конфигурации — drush cim — в зависимости текущего статуса (какие сплиты активны) выполняется импорт основной конфиги и активных дополнительных. И аналогично работает drush cex.
Начальная настройка сплитов
Типовая настройка для размещения файлов конфигураций — это каталог config, размещенный за пределами DRUPAL_ROOT. Т.е. в settings.php задаётся config_sync_directory:
1 |
$settings['config_sync_directory'] = DRUPAL_ROOT . '/../config'; |
При настройке сплитов не рекомендуется помещать их в дочерние папки основной конфигурации, а располагать их на одном уровне. Потому мы перемещаем основную конфигурацию в /../config/sync, а сплиты размещаем в /../config/MACHINE-SPLIT-NAME.
Измените настройку для основной конфиги:
1 |
$settings['config_sync_directory'] = DRUPAL_ROOT . '/../config/sync'; |
Папки для сплитов настраиваются через админку.
Активация сплитов в зависимости от окружения
Нам нужно, чтобы в зависимости от окружения были активны соответствующие сплиты. Обычно это делается через файл settings.local.php, который не попадает в git и отражает локальные настройки окружения.
На забудьте его подключать из settings.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// settings.php // отключили все сплиты, // а нужный включим в settings.local.php $config['config_split.config_split.local']['status'] = FALSE; $config['config_split.config_split.dev']['status'] = FALSE; $config['config_split.config_split.stage']['status'] = FALSE; $config['config_split.config_split.prod']['status'] = FALSE; $local_settings = __DIR__ . "/settings.local.php"; if (file_exists($local_settings)) { include $local_settings; } |
В settings.local.php:
1 2 3 4 |
// activate local split config $config_active = 'local'; $config['config_split.config_split.' . $config_active]['status'] = TRUE; |
Если хостинг поддерживает серию системных окружений, например как это сделано в Pantheon или Acquia, то нужный сплит можно активировать, отталкиваясь от переменных окружения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// для пантеона if (defined('PANTHEON_ENVIRONMENT')) { switch (PANTHEON_ENVIRONMENT) { case 'dev': $config['config_split.config_split.dev']['status'] = TRUE; break; case 'test': $config['config_split.config_split.stage']['status'] = TRUE; break; case 'live': $config['config_split.config_split.prod']['status'] = TRUE; break; } } |
Config Split предлагает две разные подсистемы настроек — это полное разделение конфигураций (complete split) и частичное (partial split). В чем разница?
Complete Split
Наиболее удобен в случае модулей, которые используются только в каком то определенном системном окружении. Например, devel, который нужен только локально.
Алгоритм примерно следующий:
- Активируйте local сплит,
- Включите devel, настройте его.
- Отметьте devel галочкой в complete split в сплите local
- Выполните экспорт — drush cex.
Настройки devel будут убраны из общего конфига (sync), но появятся в local. Модуль в общих настройках при этом будет отключен (core.extensions.yml).
Partial Split
Этот подход полезен, когда вы используете какую то настройку или модуль в разных окружениях, но есть небольшие отличия.
Изначально нужно сконфигурировать наиболее общий случай. Он будет храниться в /sync. Далее выполняется настройка сплита. Например, вы хотите, чтобы в локальном окружении не производилась агрегация стилей:
- Настройте общий случай (агрегация включена), drush cex.
- Активируйте нужный вам сплит (я меняю имя $config_active = ‘local’; в settings.local.php)
- Добавьте настройки system.performance.yml в partial split секции Local (соответствующая галочка)
- Отключите агрегацию /admin/config/development/performance
- Выполните drush cex
В папке local будет создан т.н. config split patch для system.performance.yml, который опишет отличия от основной конфигурации.