无法安装…在活动配置中已存在


15

在Drupal 8.1上,当我尝试激活对基本页面进行一些修改的自定义模块或自定义功能时,我一直在运行此类消息。(添加字段)。

真烦人...

脚步:

  • 完全清除数据库
  • 转到/install.php并选择标准配置文件
  • 现在站点正在运行,请转到扩展
  • 选择功能-基本页面

结果:

Unable to install Feature - Basic Page, core.base_field_override.node.page.promote, core.entity_form_display.node.page.default, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, field.field.node.page.body, node.type.page already exist in active configuration.

是的,我要做的就是:更改那些默认设置!

扩展:

能够安装对基本页面进行一些修改的功能。

我的特色

这是我使用功能模块创建的功能

它基本上将两个字段banner_image和background_image添加到基本页面

档案:

config
    install
        core.base_field_override.node.page.changed.yml
        core.base_field_override.node.page.created.yml
        core.base_field_override.node.page.promote.yml
        core.base_field_override.node.page.status.yml
        core.base_field_override.node.page.sticky.yml
        core.base_field_override.node.page.title.yml
        core.base_field_override.node.page.uid.yml
        core.entity_form_display.node.page.default.yml
        core.entity_view_display.node.page.default.yml
        core.entity_view_display.node.page.teaser.yml
        field.field.node.page.body.yml
        field.field.node.page.field_banner_image.yml
        field.field.node.page.field_image.yml
        field.storage.node.field_banner_image.yml
        language.content_settings.node.page.yml
        node.type.page.yml
feature_basic_page.features.yml
feature_basic_page.info.yml

为什么不支持这种简单的方法?是虫子吗?我应该怎么做才能使用我的功能?


1
使用drupal EasyInstall 模块,该模块用于删除活动配置
Karthikeyan Manivasagam,

1
+1有趣的模块-值得一看-谢谢@KarthikeyanManivasagam
therobyouknow

Answers:


24

有了草草,你可能可以做

drush config-delete module_name.settings

删除抱怨的配置


在与Drupal的史诗般的战斗中,我还发现您可以将这些配置移动到optional/文件夹中以使其关闭。但是我不确定所有的含义……
纪尧姆·博伊斯

@GuillaumeBois:含义是,如果已经安装或不满足依赖项,则这些可选的配置将被忽略。因此,如果必须配置才能使模块正常工作,则可能导致其他问题。
Renrhaf

+1谢谢@GiorgosK(第2部分,共1部分):我发现此解决方案适用于我的情况:在我的开发站点的Web浏览器中显示了此错误:Warning: in_array() expects parameter 2 to be array, null given in lightning_layout_block_alter() (line 91 of modules/contrib/lightning_layout/lightning_layout.module).在另一台机器上设置了站点代码git源和数据库后。
therobyouknow

(第2部分,共2部分)因此,为了解决该问题,我尝试卸载lightning_layout并重新安装它。drush pm-uninstall lightning_layout工作正常,但是当我尝试重新安装它时,drush en lightning_layout出现以下命令行错误“在PreExistingConfigException.php第65行:lightning_layout提供的配置对象(field.storage.node.panelizer)已存在于活动配置中”,因此我使用了解决方案:因此drush config-delete field.storage.node.panelizer 能够重新启用该模块:drush en lightning_layout
therobyouknow

1
如果不确定要删除哪些“设置”,则应运行“ drush config-list”以获取配置的确切名称
Jorge Valvert,

3

不支持该功能,因为模块可能无法用install config替换已存在的配置实体。

要为现有节点类型添加表单和视图模式配置,必须在hook_install()中的代码中实现此配置。

或者,您必须先在站点上删除节点类型,然后再删除内容。

不,这不是错误,这是为了防止配置丢失而定义的方式。


真伤心 在D7中,这是可能的(通过功能将字段添加到基本页面)。我仍然认为它也应该在D8中。您说这是为了防止配置丢失,但实际上,它只是添加了配置(字段,重量,标签等)。请注意,我自己的自定义模块也存在此问题。
Guillaume Bois

不,它不只是添加。视图和表单显示在单个节点类型的所有字段之间共享。如果两个模块尝试添加该文件,谁会赢,会发生什么?页面类型上已经存在的现有字段会怎样?如果基本节点类型存在但设置与您的字段不同,该怎么办?诸如此类的行为场景尚未定义。对于独立功能,最好定义自己的节点类型,并在您自己的站点上部署此更改,您不需要像7.x中那样的功能模块,只需导出配置并再次导入即可。
Berdir '16

@berdir,这非常有趣。因此,我试图创建一个包含视图和表单注释的用户配置文件功能来解决这个问题。那么,您是说无法在功能中完成此操作,因为用户内容类型已经存在并且该功能正在尝试启用该功能吗?是否有某种方法允许某个功能覆盖此功能,以便有人可以在现有站点上启用配置文件功能?
kaleemclarkson

@kaleemclarkson用户不是内容类型,而是实体类型。做到这一点的唯一方法就是我所描述的,您必须在功能模块的hook_install()中实现代码以设置表单并查看显示配置。或使用配置文件模块并在其中定义您自己的配置文件类型。
贝尔迪尔

3

找到模块,使用 Easy Install模块清除活动配置,而不使用devel或drush。即使您错过了 模块配置文件(yml)中的可选文件夹和强制选项,它也可以正常工作


1
这是一个很棒的选择!我今天才使用它,它节省了我很多时间!
rtd1123 '18年

3

对于万神殿网站,我也有同样的问题。我输入了drush命令

Pantheonsite:drush @ pantheon.SITENAME.ENVNAME删除ERRORNAME

本地站点:drush config-delete ERRORNAME

这对我有用。



0

如果要将配置添加到自定义模块中,但它们已存在于活动配置中,并且由于某种原因,您不能使用drush删除这些配置(在我的情况下,因为它是安装配置文件的一部分),因此您可以确定覆盖配置不会有问题,这是替换那些配置的一种方法。

在自定义模块/ config / hook_install中添加一个新文件夹,并在该文件夹中然后在模块的hook_install中添加config .yml文件。

use Drupal\Component\Serialization\Yaml;

/**
 * Implements hook_install().
 */
function mymodule_install() {

  // Replace these configs.  We're using code to do this, as they are already
  // installed.
  $config_files = [
    'language.types',
    'language.negotiation',
  ];

  foreach ($config_files as $config_id) {
    $raw_data = file_get_contents(drupal_get_path('module', 'mymodule') . '/config/hook_install/' . $config_id . '.yml');
    \Drupal::configFactory()->getEditable($config_id)
      ->setData(Yaml::decode($raw_data))
      ->save();
  }
}
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.