在使用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 } },
总结:大伟哥认为,这两种方法其实都只是应变方案,都可以解决目前的问题。不过第一种更适合本地开发环境,后面一种比较适合用在生产服务器上,你觉得呢?
- 443 阅读
添加新评论