如何防止将Devel模块安装在生产环境中


26

使用新的Drupal 8配置管理器,如何防止它在某些环境中安装Devel模块?据我所知,在本地上安装它意味着下次我导出配置并将其移到其他环境(开发,测试,生产)时,它将自动启用。


使用是否可以drush接受?我前一天发现了drush config-export --skip-modules=devel。不使用草稿可能会有类似的事情,但我不知道。
mradcliffe '16

因此,每次导出配置时都必须这样做吗?必须有更好的方法:|
cambraca '16

也许您可以在.gitignore中添加一些配置文件。
digitaldonkey


2
回想起来,我认为这个问题太广泛了。可能会有很多很好的答案,因为这取决于网站的构建和开发过程。
mradcliffe

Answers:


18

方法:冲

  • 同步配置时,Drush可以忽略扩展的启用状态。

    drush cex --skip-modules=devel

    drush cim --skip-modules=devel

  • 使用Drush CMI工具,您可以使用要忽略的配置列表进行操作。

    drush cexy --ignore-list=/path/to/config-ignore.yml

    drush cimy --delete-list=/path/to/config-ignore.yml

方法:模块

  • 您可以使用配置拆分模块,该模块允许您:

    1. 将一些配置拆分到专用文件夹
    2. 黑名单配置
    3. 忽略一组配置
    4. 由配置实体配置
  • 配置只读模式模块

    该模块允许锁定通过Drupal管理UI完成的任何配置更改。例如,在不应在生产环境上进行配置更改,而只能在暂存或本地环境上进行配置更改的情况下,这很有用。

    $settings['config_readonly'] = TRUE;

  • 另一个模块是Environment Config,它允许您基于每个环境覆盖配置。


2
我真的不喜欢在我的生产服务器上拥有devel模块的所有库依赖关系,因此我使用将其添加到composer中composer require --dev drupal/devel。额外的好处是Composer安装速度更快,从而使产品部署速度更快。
Duncanmoo


6

更新:最近删除了以下描述的功能 https://www.drupal.org/project/config_split/issues/2926505


如果在部署过程中使用drush,则可以执行以下操作:

drushrc.php在与您的目录相同的目录中创建一个文件settings.php(例如:)docroot/sites/default,然后输入以下内容:

$drush_ignore_modules = array(
  'devel',
  'webprofiler',
  'devel_generate',
  'kint',
  'yaml_editor',
);

$command_specific['config-export']['skip-modules'] = $drush_ignore_modules;
$command_specific['config-import']['skip-modules'] = $drush_ignore_modules;

这意味着,您可以在过程中操纵drush cex/ drush cim命令以跳过模块。

您可以阅读有关在Drush 8中使用配置模块过滤器的更多信息。


5

drush cex --skip-modules如本问题中所述,删除了config_split,因此基于drush的解决方案对我不起作用。

这是使用config_exclude模块的基于Duncanmoo解决方案的解决方案

1.使用Composer require --dev安装config_exclude并对其进行配置

$ composer require --dev drupal/config_exclude
$ drush en config_exclude -y
$ nano sites/default/setting.php

允许settings.php用于您的本地开发环境

if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
  include $app_root . '/' . $site_path . '/settings.local.php';
}

在本地文件中添加config_exclude设置

$ nano sites/default/setting.local.php

这是一些示例设置

$settings['config_exclude_modules'] = [
    'devel', 
    'config_exclude',
    'config_filter',
    ...
    'stage_file_proxy',
];

注意1: config_filter是config_exclude依赖项,因此,如果不需要生产它,可以在上面将其排除

注2:settings.local.php不是必需的。这取决于是否由您的VCS控制。

2.作曲家需要--dev

启用仅用于开发的模块时,请使用--dev标志:

$ composer require --dev drupal/devel

这导致这些依赖项被添加到require-dev下的composer.json文件中:

...
    "require-dev": {
        "drupal/twig_xdebug": "^1.0",
        "drupal/devel": "^1.0@RC"
    }
}

因此,如果在不使用开发模块的情况下安装站点,则使用:

$ composer install --no-dev

注意:在暂存和生产环境中,应始终执行--no-dev

3.像往常一样使用rush CEX

$ drush cex 

不会导出任何排除的模块设置

注意:我注意到运行上述命令后core.extension设置似乎已被修改,但是相应的.yml从未写入硬盘驱动器(即使确认will be deleted and replaced with the active config),因此没有要提交的内容,我想这取决于config_exclude模块的内部


按照上述建议,我与@GiorgosK的经历非常相似。该解决方案对我来说非常有效,并且还包含深思熟虑的建议。我还注意到core.extension为false否定词,但实际上并没有改变git的状态,因此一切都很好。谢谢
vrwired

2

Drupal 8.3.x有一个有趣的问题:允许开发模块选择退出config-export。普遍的共识是配置拆分是当前最好的解决方案。

评论来自swentel

只是想简要地记录一下config_split的工作原理:config split split配置实体定义了被列入黑名单的内容,允许您将模块和/或配置对象黑名单。典型的例子是devel,已经有一个有趣的用例:system.menu.devel附带了它,如果您将devel列入黑名单,则由于没有依赖性,因此不会删除菜单配置文件。尽管这不是主要问题,但配置拆分还允许您单独选择该选项,因此可以在环境中将其删除。

评论来自geerlingguy

我尝试了几种不同的方法来管理特定于环境的配置,并且config_split似乎达到了正确的可用性,而到目前为止,额外的开销平衡是最好的。它既简单又轻巧,但仅允许我在某些环境中标记(并继续使用)某些配置。


2

对于某些人来说,配置拆分可能是可行的解决方案。

当导入和导出整个站点配置集时,Drupal 8配置管理最有效。但是,有时开发人员喜欢退出CM的健壮性,并在其开发计算机上启用活动的超集配置,并仅部署一个子集。一个典型的例子是在开发环境中启用devel模块或在开发环境中具有一些块放置或视图,然后不将它们导出到要部署的配置集中,而仍然能够与同事共享开发配置。

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


+1用于配置拆分,我总是使用它在产品中禁用Devel和其他模块(例如Field UI和Views UI)。请参阅使用config split禁用模块
leymannx

2

有一种整齐的方法,为方便起见,最终将自己的dev模块提交到composer中,并且这些模块的配置未添加到配置导出中(分为2部分):

1. Composer require --dev 启用仅用于开发的模块时,请使用--dev标志:

$ composer require --dev drupal/devel

这导致这些依赖项被添加到require-dev下的composer.json文件中:

...
    "require-dev": {
        "drupal/twig_xdebug": "^1.0",
        "drupal/devel": "^1.0@RC"
    }
}

因此,如果您在未安装开发人员模块的情况下安装该站点,则会说:

$ composer install --no-dev

注意:在舞台和产品环境中,应始终执行--no-dev

2.使用config_split模块

配置拆分模块使您可以创建可在环境中启用或禁用的配置导出分组。

我实际上有3个分割:

  1. 主站点配置(在任何地方启用;开发,登台和生产)
  2. 登台配置(在开发和登台中启用)-包括重新路由电子邮件模块
  3. 开发配置-包括devel,kint ...,但不重新路由电子邮件,因为在dev中启用了临时配置。

1
您确实不应该以这种方式使用开发依赖。它们更多地用于不需要在生产中运行的工具(例如代码嗅探器)。如果启用了它们,并且Drupal期望安装该模块并且代码不存在,则可能导致站点不稳定。如果Drupal / Composer是dev依赖项,它可能仍会尝试加载不在文件系统上的文件。
弗兰克·罗伯特·安德森

@FrankRobertAnderson您没有提出任何更好的解决方案?我不想在生产服务器上使用devel模块或从属库,您有什么建议?
Duncanmoo

Drupal并没有为此提供很好的选择。您的计划并不可怕,但是如果您不小心,它将导致问题。我的计划问题是config_split,成为整个站点的关键。如果不是dev依赖项,我会投赞成票,这在OP中甚至不是问题。
Frank Robert Anderson

1

我制作了一个小脚本来一次完成所有操作。

#!/bin/bash

drush pm-uninstall devel -y
drush pm-uninstall field_ui -y
drush pm-uninstall field_name_prefix_remove -y

drush config-export

drush en devel -y
drush en field_ui -y
drush en field_name_prefix_remove -y

1

您还可以看到“ 配置忽略”模块。

该模块是一个工具,可让您将所需的配置保持在适当的位置。

假设您确实希望在导出站点上显示的system.site配置(包含该站点的名称,口号,电子邮件等)在您的实时站点上保持不变,而不管配置如何。

或者,也许您已经厌倦了每次导入配置时都要更改devel.settings吗?


在这种情况下,“配置忽略”模块不合适。在模块页面上:不要忽略core.extension配置,因为它会阻止您通过config import启用新模块。将配置拆分模块用于特定于环境的模块。
bmunslow

1

您可以为此使用部署覆盖模块。阅读以下链接以获取详细说明:

http://dcycleproject.org/blog/46/continuous-deployment-drupal-style

但是,执行此操作的最佳方法是在本地禁用模块,然后导出配置。

Drupal提供了一种方法来覆盖中的配置设置settings.php,但是它们对于禁用/启用模块无效。

来自default.settings.php

/**
 * Configuration overrides.
 *  * To globally override specific configuration values for this site,
 * set them here. 
 * 
 *
 * blah..blah...blah
 *
 *  
 * There are particular configuration values that are risky to override. For
 * example, overriding the list of installed modules in 'core.extension' is not
 * supported as module install or uninstall has not occurred. Other examples
 * include field storage configuration, because it has effects on database
 * structure, and 'core.menu.static_menu_link_overrides' since this is cached in
 * a way that is not config override aware. Also, note that changing
 * configuration values in settings.php will not fire any of the configuration
 * change events.
 */
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.