如何将阻止内容从开发人员迁移到生产站点?


24

我终于开始认真看待Drupal 8了,我对配置管理特别感兴趣。我遇到了一些可能有点问题的问题,这与自定义块内容有关。

我可以看到配置管理系统能够导出块配置-区域,主题,权重,可见性等,但是在配置导出中并没有遇到实际的块内容,这是合理且可以理解的。

在将该块配置导入到生产站点时,似乎发生的情况是创建了块配置,并放置了一条保留消息,报告该块已损坏或丢失。显然,块内容在生产服务器上不存在。

如何将自定义块从开发/登台服务器迁移到生产服务器?我意识到Drupal 8中的块是像节点这样的可现场访问的实体,因此需要以相同的方式迁移,并且我了解Drupal 8中有一个Migrate API,但这似乎是为了将内容从Drupal 6和7站点迁移到Drupal 8相对于Drupal 8到Drupal 8站点。

这个问题专门针对自定义块,因为其他模块(例如,视图)生成的块显然会作为配置迁移。

blocks  8 

作品中有几种内容分阶段解决方案,包括deploy模块和entitypilot.com(免责声明,这是我的产品)
larowlan 2015年

Answers:


7

我这里没有提到的另一个答案是使用简单块模块,该模块与内核的“自定义块”设置几乎完全相同,但是您拥有了所有的块设置和内容,而不是内容+配置的怪异混合体存储在配置中,可以干净地导出和导入。

有关在Drupal 8核心中的进一步讨论,请参见:自定义块无法正确导出和导入


3

我刚刚发布了解决此问题的贡献模块。本质上,模块基于包装的自定义块(内容块)提供基于配置的块类型(固定块)。如果内容块不存在,则使用默认内容创建它;如果未设置默认内容,则为空。一切都通过UI完成,不需要特殊文件或自定义模块。

我将其命名为“固定块内容”,并发布在:

https://www.drupal.org/project/fixed_block_content


1

保留作为开发的一部分而添加到开发中的内容的另一种方法是使用“ 默认内容”模块导出内容。它是为将内容导出到安装配置文件的“ content”文件夹而构建的,然后,如果启用该模块,则在安装站点时会自动将内容带入,但是也可以一次导入一个内容,例如在更新挂钩中,在example.install或example.profile中包含以下代码:

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

导出ID为8的自定义块:

drush dcer block_content 8

(如果您未在Drush设置中设置个人资料路径,则必须在上方进行指定。)

然后在example.install文件中使用结果导出,如下所示:

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf


0

我不确定在多个环境之间同步块配置是否具有强大的优势,因为块与内容如此交织在一起。

原因是从yml文件创建了一个新的块,该块没有标题/正文(内容),因此给出了“损坏/丢失”消息。

您可以尝试使开发中的UUID(如果要在两个地方都创建块-确保机器名称匹配...),使其与生产中的uuid匹配(其他关系似乎使用该实体) ID)。然后,当您进行配置同步时,您会在yml文件中看到“查看差异”,并且可能会看到需要在dev上进行哪些其他更改以使其与生产uuid匹配,等等。除非您执行此过程或使用block_content,block_content__body和block_content_field_data为自己创建某种数据库块同步,否则最容易忽略代码中的所有块配置。

它不是很优雅,但是可以允许您将块配置保留在代码中。否则,如果您继续使用config部署块,则它们将始终“损坏或丢失”。

一篇博客文章建议在实时环境中创建一个自定义块,但不要放置它。在将数据库同步到dev后,可以配置自定义块,导出配置,并且由于它已经存在于实时导入放置中,因此可以进行配置。


0

除了相同的问题外,还没有真正的解决方案,只有附加的问题:在协作开发中,我们使用一个登台服务器,该登台服务器从存储库中提取并重置所有配置。这意味着块配置将被自动重置,您根本无法将被视为“内容”的块直接放置在该服务器上。

使用drush config-export同步很容易,同时又可以准确地知道您已经做了什么,并确保所有配置更改都适合部署。但是Drupal为我们决定了块是配置(显然,块内容是作为内容处理的)。因此,这似乎是设计使然。

在我认为的时间内,最实用的解决方案是将与块相关的yml文件添加到.gitignore。


1
Config Ignore可能比.gitignore更好:drupal.org/project/config_ignore
bdanin


0

我认为处理此问题的最佳方法是:

这是我通常看到的人使用和我个人使用的内容。但是,与仅块内容相比,它会同步整个数据库。


如果数据库覆盖没有问题,那可以工作。现在,如果唯一的愿望是将新的自定义块移动到现有数据库中,则该方法将难以实现。
karolus

从理论上讲,这个答案有它的位置。但是实际上,这不是一个好的解决方案,尤其是在项目使用配置拆分或环境之间具有任何不同配置的情况下(这很有可能)。
komlenic '18

0

请动手使用“ 结构同步”模块。

结构同步提供了Drush命令和管理界面屏幕,用于同步内容(也可以视为配置)。包括菜单项,自定义块和分类术语。

脚步:

  1. 转到结构同步。
  2. 转到块选项卡。
  3. 出口。
  4. 您的配置和内容将导出到配置文件夹中。
  5. 将配置带到其他站点并导入。
  6. 转到结构同步并单击导入。
  7. 完成了
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.