Composer:file_put_contents(./composer.json):无法打开流:权限被拒绝

117

我正在尝试将Prestissimo安装到Ubuntu 16.04服务器,但是导致了一个错误:

$ composer global require "hirak/prestissimo:^0.3"
Changed current directory to /home/kramer65/.composer


  [ErrorException]
  file_put_contents(./composer.json): failed to open stream: Permission denied


require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-update] [--no-scripts] [--update-no-dev] [--update-with-dependencies] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--] [<packages>]...
我已登录为用户 "kramer65",所以我不知道为什么无法写入我的主文件夹。当出现 "权限被拒绝" 时,我的正常反应是使用 "sudo",但此时composer会始终显示以下内容:

请勿以root/super用户身份运行Composer!详情请参见https://getcomposer.org/root

您有什么想法可以解决这个问题吗?


1
可能很明显,但必须问一下...您的 composer.json 目前的权限是什么? - TheGentleman
那么~/.composer/文件夹的权限是什么?似乎kramer65没有写入权限,使用chmod可能会有帮助。 - AnthonyB
3
虽然不完全相关,但我不建议在生产服务器上安装Prestissimo。它与较新版本的Composer的兼容性可能需要更新,而这些更新可能会在生产环境中给你带来麻烦,因此最好不要冒这个险。 - Dwight
@Dwight - 我实际上正在将 Prestissimo 安装到生产服务器上,因为我希望新更新的部署尽可能快,以便停机时间尽可能短。但是您绝对不建议在生产服务器上安装 Prestissimo? - kramer65
我曾经遇到过同样的问题,我只是简单地创建了一个带有空有效 JSON 内容的新 composer.lock 文件,然后重新运行 up --build docker。这样就解决了! - Spartacvs1
显示剩余4条评论
14个回答

296

我在安装laravel/lumen时遇到了问题。

可以通过以下命令解决:

$ sudo chown -R "$(id -un)" "$(composer config --global home)"

该命令的作用:以特权用户(root)身份执行命令,将文件所有者(而不是组)递归更改为当前用户(按名称),以 COMPOSER_HOME 目录。

由于用户名和 Composer 主目录在每个系统上都可能不同,因此使用以下两个命令来获取...

  1. ... 用户名:id -un
  2. ... composer 主目录:composer config --global home

这是一个旧问题,因此答案的读者可能想了解以下内容:

  • Prestissimo 专门用于与 Composer 1 一起使用
  • 截至今天,已发布了 Composer 2,它已不再受益于 Prestissimo
  • 但是,截至今天,已经发布了 Composer 2.2,这是一个长期支持(LTS)版本,您应该立即用其替换 Composer 1,如果您过去认为需要 Presstissimo,则它通常比 Composer 1 更快-无论是否使用 Prestissimo

如何继续:

  1. 从任何系统中删除 Prestissmo
  2. 将 Composer 1 替换为 Composer 2.2。
  3. 享受。

2
这个方法在yii2安装composer全局资源插件时对我也有效,感谢Samuel。 - Geoff
4
使用 $USER 而不是 'myuser' 是更好的选择。 - Levent Yumerov
2
对我来说,它没有解决问题,很奇怪。还有其他的提示吗? - mylord
2
{btsdaf} - Samuel Martins
8
这是一个好的提示。然而,如果您已经创建了您的项目,请运行sudo chown -R $ USER my_project。 - Daniel
1
sudo chown -R $(id -un) ~/.composer/ - Ugur Kazdal

19
为了解决这个问题,你需要打开一个终端窗口并输入以下命令:sudo chown -R user ~/.composer(其中user是你当前的用户名,在你的情况下是kramer65).
当你运行这个命令后,你将有权限运行composer全局require命令。
你可能还需要从当前目录中删除 .composer 文件,为此,请打开终端窗口并键入以下命令:sudo rm -rf .composer.

这与已接受的答案有何不同?删除您在答案末尾建议的 .composer 文件的好处是什么,以及何时也需要这样做?这不会使第一个回答的 chown 操作变得无意义吗?您能详细解释一下吗?我认为这会改善您的答案。 - hakre

12
在Ubuntu 18.04中,我需要在~/.config/composer/内使用chown命令。







sudo chown -R $USER ~/.config/composer

全局命令现在可以使用。


这与被接受的答案有何不同?被接受的建议递归 chown ~/.config,也会执行您建议的递归 chown ~/.config/composer 吗?您的答案相对于长期被接受的答案有什么好处,以至于在 2020 年 12 月您认为需要一个额外的答案? - hakre
@hakre $ sudo chown -R "$(id -un)" ~/.composer/ 不是针对 ~/.config/composer 的吗? - Jonathan
是的,这是旧名称,但它仍可能是备选方案。我们应该适当地记录下来。如果我没记错,我们正在寻找 $(composer config home)。无论哪个版本/安装,它都会给出正确的路径。 - hakre
1
那时我混淆了.composer.config。我承认错误。根据Composer文档获取文件夹的实际命令是 $(composer config --global home)。感谢您的反馈! - hakre

10

在我的情况下,我没有与~/.composer有相关问题。
因此,在Laravel应用程序的根目录中,我运行了 sudo chown -R $USER composer.lock 命令,这很有帮助。


实际上,除了使用composer install之外,您应该将应用程序部署/安装到webroot中。这样,您就不会遇到您在此回答的问题(这与关于COMPOSER_HOME而不是webroot文件夹的问题无关)。 - hakre
是的,我认为答案实际上已经存在,当“where”不太重要时,例如sudo chown可以工作,现有答案中的步骤是相同的,重复并没有帮助(在我看来)。评论是为了让您知道,在您的情况下,您可以通过分而治之受益:您可能有一个不同的问题(只有使用sudo chown的解决方案有效)。这并不是说您的解决方案本质上有任何问题,只是上下文不同。如果这样说清楚/有帮助,请告诉我。 - hakre

5

在我的情况下,其他答案中提到的所有位置的权限都是正确的,但我仍然遇到了这个错误。

结果发现有一些供应商目录是由root拥有的。当Composer进行更新或安装时,会在各个地方编写 composer.lock 文件。

因此,解决我的问题 - 这是特别针对Laravel Sail容器的 - 所有权都被切换到项目中的用户sail

以root身份进入sail容器:

vendor/bin/sail root-shell

设置项目中所有文件的文件所有权:

chown -R sail:sail /var/www/html

你可能只想先尝试做供应商目录:
chown -R sail:sail /var/www/html/vendor

在从手写的 docker-compose.yaml 设置切换到 Laravel Sail 后,所有权出现了问题。在我看来,Laravel Sail 以明智的方式处理文件所有权和权限,将root与应用程序用户sail分开。

5

我也遇到过这个问题,但我的情况是因为我在错误的目录下。请检查您正在工作的目录。


3
在我的情况下,.composer是由root拥有的,因此我执行了sudo rm -fr .composer,然后我的全局要求生效了。 警告! 如果您不确定自己在做什么,请不要使用该命令。

2
这可能是一个非常特殊的情况,但如果你正在使用Travis CI并利用缓存功能,你可能需要清除所有缓存并重试。
当我从sudo构建切换到非sudo构建时,解决了我的问题。

0

我在安装在

C:\composer

的Windows版本的Composer中遇到了同样的问题。

当我尝试运行以下命令时

C:\composer require aws/aws-sdk-php

我只需进入Composer安装文件夹并再次尝试即可

C:\composer>composer require aws/aws-sdk-php

该软件包很快就安装好了。


0

当我在使用WSL Windows 10时,出现了相同的错误。 我使用以下命令来解决它:-

sudo chown -R $USER  /home/<username>/.config/composer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接