如何修复 npm 抛出无需 sudo 的错误

1498

我刚刚通过nodejs.org上的包安装了Node和NPM,但每当我尝试使用npm搜索或安装某些东西时,它都会抛出以下错误,除非我用sudo命令。我觉得这可能是一个权限问题?我已经是管理员了。

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0

42
请考虑使用 NVM(而不是劫持权限)来解决问题,参见:https://dev59.com/rmQo5IYBdhLWcg3wUd-L#24404451 - Yves M.
2
@janaspage 你不能通过NPM(Node包管理器)安装node或NVM(Node版本管理器),这是不合理的。NPM与node一起提供(它们同时安装)。请查看维基百科页面:http://en.wikipedia.org/wiki/Npm_(software) - Yves M.
6
终于有比“sudo chown”更好的解决方案了:https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md - Dmitri Zaitsev
在OSX上,使用官方的pkg安装程序安装node时,这个解决方案不起作用。我使用了这个:https://dev59.com/rmQo5IYBdhLWcg3wUd-L#34968008 - fmquaglia
3
它解释了问题和解决方法:https://docs.npmjs.com/getting-started/fixing-npm-permissions - n00b
显示剩余4条评论
39个回答

2
如果sudo chown -R $(whoami) ~/.npm对您不起作用,或者您需要非终端命令解决方案。问题在于您的用户帐户没有写入node_modules文件夹的权限,因此您可以执行以下操作:
  1. 打开finder并按下cmd+shift+g,这将使用url打开转到文件夹

  2. 输入以下路径/usr/local/lib/node_modules并点击转到

  3. 右键单击node_modules文件夹并选择获取信息

  4. 向下滚动到共享和权限部分

  5. 解锁以进行更改。

  6. +并添加您的用户帐户

  7. 确保您在特权下拉菜单中选择读取和写入

现在,您应该能够安装软件包而无需使用sudo,并且权限问题应该已经解决了。

2

试一试

npm rebuild

在完成后运行常规命令。


2
没人提到这一点,但实际上不需要与权限或单独的npm安装搞乱,只需将不同的缓存文件夹指定给命令即可解决问题。
npm install --cache .npm
npm run build --cache .npm

这将创建一个本地的.npm文件夹。

1
您可以尝试这个,在Ubuntu和Mac上适用。

您可以尝试这个,在Ubuntu和Mac上适用

sudo chown -R $(whoami) /usr/local/lib/node_modules

1
我在Mac上运行了这个命令,完美地工作了100%:sudo chown -R $(whoami) /usr/local/lib/node_modules - leeroya

1
尝试使用root身份全局安装软件包时,可能会出现EUIDLOOKUPEACCES的错误,或者npm会破坏您的用户全局软件包权限。要了解问题的原因,建议阅读此问题。简而言之,npm尝试使用当前进程的EUID来运行安装脚本,而不是作为root,而是作为最初运行npm的用户,同时假设以root身份运行的用户将使用sudo,因此将设置EUID

这就是基于使用sudo@JHM16答案有效的原因。

但是,在容器构建中安装软件包时情况并非如此。在容器中,sudo通常会缺失,构建通常只会以root身份运行。

当然,容器构建可以更改为以普通用户身份运行这些命令,并将所有内容都构建为该用户。这并不会使构建更加安全,并且在某些情况下可能是不可取的。

因此,在容器构建中,以下是如何让npm全局安装例如yarn软件包的方法:

# setpriv --ruid 0 --euid 0 npm --unsafe-perm install -g yarn

setpriv是一个小型的低级实用程序,应该可以在任何Linux发行版上轻松安装或使用。


1

以下是我在Windows 8.1上解决问题的方法:

  • 进入您的nodejs安装目录(通常为C:\Program Files\nodejs)
  • 右键单击node_modules文件夹并转到属性
  • 点击安全选项卡和高级选项
  • 在顶部,您将看到“所有者:SYSTEM”,点击更改
  • 输入您想要授权的用户并单击确定
  • 选中高级设置底部的框“用此对象继承可继承的权限项替换所有子对象权限项”并单击确定
  • 进行所需的npm安装/更新操作

1

在安装软件包时,请使用以下命令

 sudo npm install --unsafe-perm=true --allow-root

如果您感兴趣,请查看我的答案,避免在容器构建过程中需要使用 sudo。https://dev59.com/rmQo5IYBdhLWcg3wUd-L#73167840 - akostadinov

0

@Yves M.的答案与我的解决方案非常相似。这是我使用的命令,与他的略有不同。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

然后查询最新版本:

nvm ls-remote

然后安装最新版本:

nvm install YOUR_VERSION_HERE

例子

nvm install v5.8.0

0

其实,我也遇到了同样的问题。我正在运行Ubuntu操作系统。我的问题是因为我丢失了Ubuntu的公钥。即使更新系统也无法解决问题。它一直提示GPG错误。在这种情况下,您可以使用以下命令来恢复您的密钥:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

之后npm工作正常!


0
我认为最好的选择是npm文档中建议的方法,首先运行npm config get prefix检查默认安装全局node_modules的位置。如果像在Trusty上一样得到/usr,你可能想将其更改为一个你可以安全拥有而不会像我一样弄乱事情的文件夹。
为此,请选择或创建一个新文件夹。您可能希望将其放在您的主目录下,或者像我一样放在/usr/local下以保持一致性,因为我也是Mac用户(我不想根据我面前的机器不同而需要查看不同的位置)。这样做的另一个好处是/usr/local文件夹可能已经在您的PATH中(除非您喜欢搞乱您的PATH),但是您新创建的文件夹的机会不大,您需要在 .bash-profile .bashrc 文件中自己添加它到PATH中。
长话短说,我使用命令npm config set prefix '/usr/local'更改了全局模块的默认位置,创建了文件夹/usr/local/lib/node_modules(它将被npm使用),并使用命令更改了npm使用的文件夹的权限:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

现在您可以安全地全局安装任何模块。希望这可以帮助您!

如果用户没有正确设置这些 npm 配置,那么递归地为整个操作系统设置权限将使其系统变得不可用。这是一个非常糟糕的结果。 - aggregate1166877

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