Composer: Could not delete web/sites/default/default.settings.php

大伟哥 提交于 2020-08-18,周二, 18:42 ,最近更新于2020-08-25,周二, 12:43

在使用composer require安装Drupal模块或者主题的时候,有可能会安装失败,Composer报错如下:

Scaffolding files for drupal/core:
Installation failed, reverting ./composer.json to its original content.
  [RuntimeException]
  Could not delete .../web/sites/default/default.settings.php:

因为安全原因,在web/sites/default目录下default.services.yml和default.settings.php这两个文件的默认权限是644,也就是-rw-r--r--,但是它们的上级目录,权限设置却是555(dr-xr-xr-x),Composer的Drupal Scaffold插件没法删除这两个本来就存在的文件,因些造成模块安装失败。

大伟哥在Drupal的官网上找到几篇相关的文档和问题讨论,找到了两个比较简单的解决方法。

第一个方法:修改default文件夹权限为可写

这个方法是在Drupal官方文档 Starting a Site Using Drupal Composer Project Templates 里提到的,就是手动修改default文件夹的权限,给用户加上写权限:

chmod u+w web/sites/default

但是注意,Drupal会自动对default目录进行权限加固(permissions hardening),所以我们需要告诉Drupal在本地开发环境下不要自动重设目录权限。这就需要两步额外操作:

1.启用settings.local.php设置。

打开sites/default/settings.php,找到最后几行启用setttings.local.php的代码,把前面的注释符号删除,变成以下格式:

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

2.将/web/sites/example.settings.local.php复制到/web/sites/default/目录下并重命令为settings.local.php,并确认文件里有这样一行代码:

$settings['skip_permissions_hardening'] = TRUE;

这样Composer就可以顺利删除default.services.yml和default.settings.php这两个文件,从而继续运行下去了。

第二种方法:修改composer.json的scaffold配置,忽略这两个文件的复制更新

在Drupal的问题提交帖子Composer scaffolding fails when permissions on default.settings.yml or default.settings.php is not writable里,有人提出反正composer scaffold插件里面不包含Drupal的任何功能还出问题,干脆composer remove drupal/core-composer-scaffold算了。

但是目前看来最稳妥的解决方法还是不删除drupal/core-composer-scaffold,而只是让它忽略对default.services.yml和default.settings.php这两个原有文件的删除和更新,最给出了应变方法。不过帖子主体里面的代码路径有问题(漏了/default/目录),大伟哥实测可行的代码如下:

"drupal-scaffold": {
      "locations": {
        "web-root": "web/"
      },
      "file-mapping": {
        "[web-root]/sites/default/default.services.yml": false,
        "[web-root]/sites/default/default.settings.php": false
      }
    },

总结:大伟哥认为,这两种方法其实都只是应变方案,都可以解决目前的问题。不过第一种更适合本地开发环境,后面一种比较适合用在生产服务器上,你觉得呢?

文章分类

标签

添加新评论

此字段内容将保密,不会被其他人看见。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
验证码
发布评论前,请通过下面的验证,以免被当作垃圾评论机器人屏蔽。
7 + 4 =
计算出这道简单的算术题并键入答案。例如、1+3,就输入 4。