Drupal 8:具有配置拆分的多站点配置

为具有通用配置的多站点环境设置 Drupal 8 站点并不太难,它只需要一些远见卓识和一些计划以将事情做好。您需要牢记默认配置,然后考虑每个站点如何以不同方式覆盖此配置。我最近看到它做错了几次,一旦你走错了路,让事情重新回到正轨可能会很困难。

默认配置涵盖内容类型、词汇表、字段、视图、启用的模块或构成站点结构的任何其他内容。每个子站点将通过为主题组件、自定义块放置或该站点自定义的任何其他内容添加配置来覆盖此设置。

像这样的多站点设置的关键元素是配置拆分模块(又名“配置拆分”)。此模块允许您拥有默认配置,然后允许站点覆盖此默认配置,甚至仅向该站点添加配置自定义。配置拆分最常用于在开发站点、测试站点和生产站点之间创建差异,但它也可用于创建子站点。配置拆分提供了两种类型的配置覆盖。即条件/灰名单完整/黑名单

  • 完整/黑名单- 这是默认配置中不存在的任何配置。因此,它应该只存在于它配置的子站点上。这将是仅适用于单个站点的自定义字段或内容类型之类的内容。也许黑名单最常见的用途是配置任何内容块位置,因为这些位置需要创建内容才能正常工作。就您的配置中的文件而言,这意味着只有该站点才会拥有配置文件的副本。

  • 条件/灰名单- 这是默认配置中存在的任何配置,但在此站点上被覆盖。这将类似于 system.site.yml 配置文件,其中包含站点的名称,但实际上可以是任何其他配置文件。就配置中的文件而言,这意味着每个站点都将拥有配置文件的副本。

配置拆分模块的最新版本已从管理表单中删除了灰名单/黑名单文本,因为生成的配置仍显示此文本,我在本文中仍将其称为灰名单/后备名单。老实说,我可以理解为什么要这样做,因为当您第一次掌握该模块时,灰名单/黑名单可能有点令人困惑。

安装此模块后,我们可以查看设置。

设置配置拆分

在设置任何拆分之前,您首先需要创建一个用作默认环境的 Drupal 站点。这可能是最重要的事情。您需要事先确切知道将进入站点的内容并以适当的方式创建站点。尝试创建一个包含尽可能多的默认元素的网站,不要添加任何硬性定制,因为从长远来看,这将使生活更轻松。请务必避免任何形式的内容,如分类术语或内容块,因为这些内容往往会导致在站点之间移动配置时出现问题。

设置完成后,启用 Configuration Split 模块并转到管理页面 Home > Administration > Configuration > Development > Synchronize > Configuration Split Setting。您将看到没有设置任何配置,因此只需单击“添加配置拆分设置”按钮即可。在此页面上,您将看到几个表单元素,因此我将在此处逐一介绍。

标签只是该网站的人类可读的标签,但因为这将被翻译成机器命名为得到它的权利,因为这以后会对你设置一个轴承是非常重要的。您在此处输入的内容将被“塞入”一个字符串并用作拆分的 ID。例如,如果您在“我的网站”中放置该文本,则该文本将被插入my_site 中,但您可以像更改字段名称一样对其进行编辑。

 表单的静态设置部分允许您设置配置的一些全局属性。该说明仅仅是一个描述配置分裂正在设置更多的文本。该文件夹是配置目录的相对于所述的Drupal文档根的位置,。这将取决于您为默认配置目录设置的设置(在settings.php文件中使用 $config_directories['sync'] 设置),但最好将其作为该默认目录的同级。您可能希望将其设置为 ../config/my_site 之类的内容,为其赋予与配置拆分 ID 相同的名称,以保持良好且易于理解。

重量,当你有需要申请对同一站点不同的配置使用。如果您碰巧有多个活动的拆分,这允许您将一种配置设置为高于另一种。出于此设置的目的,权重不是一个因素,因此只需将其保留为 0。

活动设置告诉Drupal的,如果配置应使用与否。默认为“活动”,但我强烈建议在创建配置拆分时将其关闭。理想的情况应该是所有配置拆分都关闭,并且您使用settings.php文件中的逻辑来打开应该处于活动状态的配置拆分。我稍后会谈到这个方面。

接下来是完整的拆分黑名单配置。这分为3部分。您可以选择单个模块的所有配置,选择单个配置项,或者在文本框中输入要包含的配置项。您从此部分中选择的任何内容都将从默认配置中排除,并且仅在子站点配置中可用。

即使在默认的 Drupal 安装中,也有相当多的配置需要通过,因此必须浏览该列表可能会有点问题。值得庆幸的是,如果您在文本区域中输入配置项,那么模块会将它们传输到配置项列表中,这意味着您不必单独选择它们。

第一次创建配置拆分时,您可以将此位留空。

要记住的一件非常重要的事情是,永远不要将核心配置添加到黑名单中。添加 system.site.yml 或 core.extension.yml 等文件将导致配置损坏。这是因为 Drupal 灌输需要这些文件,并且必须存在于默认配置目录中才能正常工作。如果默认配置中没有这些文件,您的配置导入将无法运行。

最后一件事是条件拆分灰名单 配置。这是您覆盖默认配置中已有内容的地方。您可以通过从列表中挑选配置或通过将它们一次添加到文本区域来将配置指定为灰名单。就像黑名单一样,如果您在站点配置中已经存在的文本框中输入任何内容,那么它会自动被选中。

第一次设置配置拆分时,您可以将其留空。

灰名单配置有两个附加选项,可更改灰名单文件和管理的方式。为灰名单包含相关配置的选项将按照它的描述进行操作,并从您包含的项目中添加任何其他相关配置项目。保留此选项对于保持配置稳定很有用,但它可能会添加您不期望的配置项。仅在灰名单不同时拆分灰名单的另一个选项仅当配置文件不同时,才会将默认配置中的配置文件复制到配置拆分中。此选项应始终保留,因为您只想在配置不同时移动配置。理想情况下,除非确实需要,否则您不希望移动配置文件,因此此选项有助于将配置噪音降至最低。

首先,您希望将黑名单和灰名单留空。但在继续之前,您还需要创建您在配置中规定的目录。除非该目录存在,否则模块不会让您保存表单。

保存后,您可以使用drush cex导出默认站点的整个配置。在我的设置中,Configuration Split 生成了一个名为 config_split.config_split.my_site.yml 的文件,如下所示。

uuid: b97e7b96-1b0f-4105-bce8-2f3b044ea49a
langcode: en
status: false
dependencies: {  }
id: my_site
label: 'My Site'
description: ''
folder: ../config/my_site
module: {  }
theme: {  }
blacklist: {  }
graylist: {  }
graylist_dependents: true
graylist_skip_equal: true
weight: 0

多站点设置的起点应该是将 system.site.yml 配置添加到灰名单,因为您可以在此处更改站点名称。这会将拆分更改为如下所示:

uuid: b97e7b96-1b0f-4105-bce8-2f3b044ea49a
langcode: en
status: false
dependencies: {  }
id: my_site
label: 'My Site'
description: ''
folder: ../config/my_site
module: {  }
theme: {  }
blacklist: {  }
graylist:
  - system.site
graylist_dependents: true
graylist_skip_equal: true
weight: 0

这意味着当您导出“我的站点”站点的配置时,它将在 config/my_site 配置目录中创建 system.site.yml 的副本,其中包含对配置的更改。

为您需要创建的每个多站点创建一个配置拆分条目,并确保将它们导出到您的默认站点配置中。

创建多站点拆分

有了所有这些,现在是分拆第一个多站点的时候了。

在以通常的方式设置 Drupal 多站点设置后,您可以使用最新版本的 Drupal 安装站点。从 Drupal 8.6.0 开始,可以使用现有配置安装站点。这以前只能使用名为 Configuration Installer 的项目或使用 Install Profile Generator 创建配置文件才能实现,因此这非常方便。当您有一个空数据库和一个适当的配置时,您将看到一个额外的可使用任何现有配置的灌输配置文件。

如果您这样做,一个警告是不要使用带有hook_install()钩子的安装配置文件,因为目前 Drupal 8.6.3 不支持此功能。如果您已使用标准配置文件(或类似配置)进行安装,那么您可以修改 core.extension.yml 中使用的安装配置文件以删除对标准配置文件的任何提及。

在安装站点之前,您需要为该站点启用配置拆分。这是通过settings.php在适当的多站点中编辑文件并添加以下配置覆盖来完成的。这就是我们将配置拆分设置为不活动的原因,其想法是您只想设置正确的配置以随时启用。

$config['config_split.config_split.my_site']['status'] = TRUE;

安装站点后,您可以对其进行配置以满足您的需要,然后在准备好后导出站点的配置。这里唯一的区别是您还需要包含 --uri 标志,以便 Drush 知道它正在查看哪个站点。

drush cex --uri=mysite.example.com

此命令将生成从默认值更改的配置项列表。您可以使用此列表作为更新配置拆分管理页面的一种方式,以正确设置黑名单和灰名单设置。例如,在安装站点后,我向文章内容类型添加了一个字段并更改了一些其他设置,这是我收到的配置概要。

+------------+-----------------------------------------------+-----------+
| Collection | Config                                        | Operation |
+------------+-----------------------------------------------+-----------+
|            | field.storage.node.field_number               | Create    |
|            | field.field.node.article.field_number         | Create    |
|            |system.date                                  | Update    |
|            |system.site                                  | Update    |
|            | core.entity_form_display.node.article.default | Update    |
|            | core.entity_view_display.node.article.default | Update    |
+------------+-----------------------------------------------+-----------+

您可以在此处开始更改配置拆分中的黑名单和灰名单设置。使用此列表可以清楚地看到,为该站点创建的任何项目都应进入黑名单,配置中更新的任何项目均应进入灰名单。返回此站点的配置拆分设置并将相关配置项添加回配置。再次导出所有配置并接受更改(这次包括配置拆分设置)后,配置拆分配置文件如下所示。

uuid: b97e7b96-1b0f-4105-bce8-2f3b044ea49a
langcode: en
status: false
dependencies: {  }
id: my_site
label: 'My Site'
description: ''
folder: ../config/my_site
module: {  }
theme: {  }
blacklist:
  - field.storage.node.field_number
  - field.field.node.article.field_number
graylist:
  - system.date
  - system.site
  - core.entity_form_display.node.article.default
  - core.entity_view_display.node.article.default
graylist_dependents: true
graylist_skip_equal: true
weight: 0

“我的站点”配置目录现在包含已更改的配置。

$ ls -1 config/my_site/
core.entity_form_display.node.article.default.yml
core.entity_view_display.node.article.default.yml
field.field.node.article.field_number.yml
field.storage.node.field_number.yml
system.date.yml
system.site.yml

请注意,一些博客文章会告诉您需要运行drush csex以便为您的拆分导出配置。但是,从 Drush 8.1.10 版开始,不再需要这样做了。

所需要做的就是为要创建的任何额外站点重复此安装、配置和导出过程。

开发、阶段和生产

这个难题的最后一个小部分是为不同的环境创建不同的分割。这需要创建规定不同环境的附加拆分。

这里需要注意的关键是你不能嵌套配置目录。例如,如果您在config/my_site 中有您的配置,那么您不能将开发站点配置放在config/my_site/dev 中。配置检测无法深入到这样的目录中,因此您需要将其创建为同级目录,以便我的站点的开发版本保存在config/my_site_dev

有一种方法可以解决这种情况。如果您将站点的配置拆分放到 config/my_site/config 中,那么您可以拥有一个如下所示的结构。

config/my_site/config
config/my_site/dev
config/my_site/test

如果您计划拥有多个子站点,这样设置站点是个好主意,因为它有助于减少配置中的目录数量。

要使环境正常工作,您只需要修改配置拆分检测,以便在某些环境设置到位时激活它。这将取决于您拥有什么样的服务器设置,但您需要拥有如下内容。最好也将生产配置设为默认配置,这样如果出现任何问题,生产配置将自动激活。

if (getenv('DEV') == TRUE) {
  $config['config_split.config_split.mysite_dev']['status'] = TRUE;
}
else {
  $config['config_split.config_split.mysite']['status'] = TRUE;
}

概括

配置拆分可与 Drupal 多站点功能一起使用,为您的站点创建强大的设置。您可以创建许多继承单个配置集的站点,同时拥有足够的自由来做自己的事情。这种方法确实需要一些计划才能正确,但只要您沿着正确的路径开始,那么一切都应该正常工作。