如何修复 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个回答

10

TL;DR

在运行 npm install 安装全局包时,始终使用 sudo -isudo -H。因为使用 sudo 时,npm 将文件安装到相同的目录中,但现在这些文件由 root 用户拥有。


当使用 npm 时,它会将软件包下载到用户主目录中。 当以 sudo 方式运行时,npm 会将文件安装到相同的目录中,但现在这些文件由根用户拥有。

因此,每个使用 npm 的人都会遇到以下情况:

  • 使用 npm install foo 安装一些本地软件包没有问题
  • 使用 sudo install -g foo-cli 安装全局包没有问题
  • 尝试使用 npm install bar 安装本地包
  • 对需要再次执行 chmod 命令感到沮丧

如果您在 sudo 命令中使用 -i-H 选项,则主目录将更改为 root 的主目录。任何全局安装都将缓存到 /root/.npm,而不是位于 /home/me/.npm 的属于 root 用户的文件。

只需始终在运行 npm install 安装全局包时使用 sudo -isudo -H,您的 npm 权限问题就会消失。

永久解决此问题。

-- 参考 修复已经损坏的 npm 的接受答案。


最佳和简单的修复方案 - Manjeet Singh
FYI,最后一个链接现在似乎已经失效了。 - studgeek

7
当你运行npm install -g somepackage时,可能会遇到EACCES错误,要求你以root /管理员身份再次运行命令。这是一个权限问题。
修复它很容易,打开终端(应用程序>实用程序>终端)。
sudo chown -R $USER /usr/local/lib/node_modules

我强烈建议您不要使用sudo(sudo npm -g install something)进行包管理,因为以后可能会出现一些问题。

参考资料:http://foohack.com/2010/08/intro-to-npm/


太好了!这个命令对我起作用了!在执行上面的其他命令之后:sudo chown -R \whoami` ~/.npmsudo chown -R `whoami` /usr/local/lib`。 - Regis Zaleman
8
这可能会导致许多其他应用程序的权限问题,所以我建议不要这样做。为什么要把一个坑换成另一个坑呢? - Brad Parks
1
或者至少将其精简到 /usr/local/lib/node_modules。 - Ken
这是我的问题。在新的Macbook(OS X 10.10.3)上,/usr/local/lib/node_modules上的权限为:$ ll /usr/local/lib/node_modules total 0 drwxr-xr-x 3 24561 wheel 102B Mar 31 18:19 .drwxrwxr-x 4 24561 admin 136B Mar 31 18:19 ..drwxr-xr-x 26 65534 staff 884B Apr 13 10:53 npm。 - tkane2000
或者根据node的安装方式,执行sudo chown -R $USER ~/local/lib/node_modules。 - Arunabh Das
显示剩余2条评论

6

我在“NPM 模块无法在没有 sudo 的情况下全局安装”中遇到了类似的问题,问题是当我通过 chris/lea ppa 仓库使用 sudo 安装 node 时出现了问题。

我的解决方法是卸载 node,然后按照以下方式重新安装:

从 nodejs.org 下载最新稳定版的 node 源码 # 在我的例子中是 node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz # 解压源码

cd node-v0.10.20 # 进入解压后的文件夹

sudo chown $USER -R /usr/local

./configure --prefix=/usr/local && make && make install

注:如果你不想更改 /usr/local 文件夹的所有权,你可以安装到你已经拥有的位置。这种方法的问题是你需要将安装目录与 bash 命令行绑定以便后面可以使用 node 命令。

mkdir ~/opt

./configure --prefix=~/opt && make && make install

echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc # 根据当前操作系统选择 ~/.profile,~/.bash_profile 或者 ~/.zshenv

无论采用哪种方法,你都可以在不使用 sudo 的情况下执行以下操作:

npm install -g module_to_install


1
最后我使用了这种方法。在构建之前,使用了sudo chown $USER /use/local。目前看起来很好,是时候尝试构建atom了!谢谢! - prasanthv

5

针对 Mac 系统(来自 Christoper Will 的回答)

Mac OS X 10.9.4

  1. 打开“系统偏好设置” > “用户与群组” > (解锁)> 点击 + :

    新建帐户 > “群组”
    帐户名称:nodegrp

    创建群组后,勾选要包含在此群组中的用户

  2. sudo chgrp -R nodegrp /usr/local/lib/node_modules/
    sudo chgrp nodegrp /usr/bin/node
    sudo chgrp nodegrp /usr/bin/npm
    sudo chown -R $(whoami):nodegrp ~/.npm


1
我不得不将一些路径更改为 /usr/local/bin,但除此之外,这个解决方案在我的OX X 10.9机器上运行得非常好 - 谢谢! - splig
不良做法是更改系统目录的所有权。 - rich remer
@richremer 我认为这取决于你想要实现什么。如果该文件夹最初只能被sudoer访问,则只能以这种方式更改。我们将更改限制在与npm相关的文件夹中。保持使用sudo是否更安全,还是更改这些文件夹的组所有权,以便普通用户可以修改它?如果普通用户不应对此文件夹执行任何操作,则当然不应更改文件夹的组所有权。 - ken
正确的做法是使用sudo安装全局包,但要使用-H标志。具体来说,sudo -H npm install -g <pkg>。这确保了系统和用户文件夹权限的正确划分。你不想做的是使用sudo npm install -g,因为这会将根拥有的文件安装到你的用户目录中。如果npm能够聪明地以正确的方式执行此操作,那就太好了,但它没有,所以你必须使用-H sudo标志来正确地进行全局安装。 - rich remer

5
只对我执行
sudo chown -R $(whoami) ~/.npm

无法工作,然后我执行了以下操作。
sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

一切正常!


您非常厉害,先生 :) - user805981
/usr/lib 目录下的文件是系统文件,不应该由你个人的用户账户拥有。 - rich remer

5
问题:您(用户)没有目录的正确权限集。
即时解决方法是使用sudo运行npm install,但这可能会导致相同的错误或不正确的安装。
而更改目录所有权不是一个好选择,只是一个临时补丁。

解决方案/建议: 更改npm的默认目录(来自官方文档

在继续之前备份您的计算机。

(可选)如果您安装错误,请先卸载它:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. 为全局安装创建一个目录:

    mkdir ~/.npm-global

  2. 配置npm使用新的目录路径:

    npm config set prefix '~/.npm-global'

  3. 打开或创建~/.profile~/.bash_profile文件,并添加此行:

    export PATH=~/.npm-global/bin:$PATH

  4. 回到命令行,更新系统变量或重新启动终端:

    source ~/.profile

  5. (可选) 测试:下载一个全局包而不使用sudo。

    npm install -g jshint


4
在我的情况下,是由于~/tmp的权限问题,因此我进行了以下操作:
sudo chown -R $USER ~/tmp

没问题!


4
问题: 您没有权限写入npm用于存储全局软件包和命令的目录。
解决方案: 允许npm的权限。
打开终端:

按下command + 空格键,然后输入“terminal”

输入以下命令:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • 注意:这将需要您的密码。

此解决方案仅允许对所需目录进行权限控制,保持其他目录的安全性。


2
降低投票,因为设置用户所有权的系统文件夹是一种反模式,而这并没有考虑到这一点。在特殊情况下,如果“npm config get prefix”在主文件夹中返回某些内容,则此解决方案将修复权限,但并没有解决在共享环境中安全地安装全局软件包的根本问题。 - rich remer
这将重写操作系统的大部分权限。例如在Ubuntu中运行此命令将导致“sudo”命令本身无法使用。 - Sahand Seifi
更改 sudo 权限是绝对不可以的!! - Dipu

2

这里有另一个配置NPM的好方法,运行以下命令:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

2
最好的解决方案是由npm文档提供的此方法
对于Ubuntu建议使用选项#2
简要步骤:
创建全局安装目录:
mkdir ~/.npm-global

配置npm以使用新的目录路径:
npm config set prefix '~/.npm-global'
npm config get prefix 可以帮助您验证是否已更新前缀。结果将是<您的主目录>/.npm-global

打开或创建一个 ~/.profile 文件并添加这一行:
export PATH=~/.npm-global/bin:$PATH

回到命令行,更新系统变量:
source ~/.profile

除了步骤2-4,您还可以使用相应的ENV变量(例如,如果您不想修改 ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global


对于Mac建议使用选项#3
在Mac OS上,您可以通过使用Homebrew软件包管理器来完全避免这个问题。

brew install node


这个 NPM_CONFIG_PREFIX 不起作用。这是 npm-descriptiton 中的错误。请参见我上面的帖子,了解正确的操作方式:https://dev59.com/rmQo5IYBdhLWcg3wUd-L#41395398 - suther

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