1416

我刚刚通过 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
4

38 回答 38

2396

这看起来像是您的主目录中的权限问题。要收回.npm目录的所有权,请执行:

sudo chown -R $(whoami) ~/.npm
于 2013-04-22T16:11:27.590 回答
690

在执行诸如写入npm 目录npm linknpm install -g等)之类的操作时,将需要您在安装 Node 时使用的权限。

您可能以 root 权限运行 Node.js 安装,这就是全局包安装要求您成为 root 的原因。


解决方案 1:NVM

不要破解权限,以正确的方式安装 Node.js。

在开发机器上,您不应该使用 root 权限安装和运行 Node.js,否则像npm link,之类的东西npm install -g将需要相同的权限。

NVM(节点版本管理器)允许您在没有 root 权限的情况下安装 Node.js,还允许您安装多个版本的 Node 以轻松使用它们。非常适合开发。

  1. 卸载节点(可能需要 root 权限)。可能会帮助你。
  2. 然后按照此页面上的说明安装NVM
  3. 通过 NVM 安装节点:nvm install node

现在npm linknpm install -g将不再要求您是 root。

编辑:另见https://docs.npmjs.com/getting-started/fixing-npm-permissions


解决方案 2:为给定用户全局安装软件包

不要破解权限,以正确的方式全局安装 npm 包。

如果您在 OSX 或 Linux 上,您可以为您的全局包和设置创建一个用户专用目录,npmnode了解如何查找全局安装的包。

查看这篇精彩的文章,了解有关在不使用 sudo 的情况下全局安装 npm 模块的分步说明。

另请参阅:npm 关于修复 npm 权限的文档。

于 2014-06-25T09:05:11.163 回答
400

您还需要node_modules目录中的写权限:

sudo chown -R $USER /usr/local/lib/node_modules
于 2013-08-24T03:23:29.273 回答
102

更改“系统全局”文件夹的所有者是一种黑客行为。在全新安装时,我会将NPM 配置为对“用户全局”程序使用已经可写的位置:

npm config set prefix "${HOME}/npm"

然后确保将该文件夹添加到路径中:

export PATH="${PATH}:${HOME}/npm/bin"

请参阅@ErikAndreasNPM modules won'tsudo global install without 的回答,以及@sindresorhus 提供的更长的分步指南,还设置了$MANPATH

于 2014-05-27T12:36:15.987 回答
73

小心!!! 小心!!! 小心!!!

chown 或 chmod不是解决方案,因为存在安全风险。

而是这样做,做:

首先检查 npm 指向的位置,如果您调用:

npm config get prefix

如果返回 /usr,您可以执行以下操作:

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

这会在您的主目录中创建一个 npm-Directory 并指向npm它。

要使此更改永久生效,您必须将导出命令添加到您的 .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
于 2016-12-30T11:18:25.623 回答
60

我在安装 Recess ( https://github.com/twitter/recess ) 为 Bootstrap 3 编译我的 CSS时遇到了这个问题。

安装凹槽时:

-npm install recess -g
  1. 你需要在你的home目录中解锁权限,就像Noah 说的:

    sudo chown -R `whoami` ~/.npm
    
  2. 您还需要对node_modules目录的写权限,就像Xilo 说的那样,所以如果它仍然无法正常工作,请尝试:

    sudo chown -R `whoami` /usr/local/lib/node_modules
    
  3. 如果您仍然看到错误,您可能还需要更正/usr/local权限

    sudo chown -R `whoami` /usr/local
    

请注意,如果您在 Mac 上,如本文 /usr/local/所述,它实际上并不是系统目录,因此,对于 Mac 用户来说,这个答案实际上是完全“安全的”。但是,如果您使用的是 Linux,请参阅下面Christopher Will的回答,了解多用户友好、系统目录安全(但更复杂)的解决方案。

于 2013-10-03T23:16:57.053 回答
40

其他答案建议将系统目录的所有权或权限更改为特定用户。我强烈反对这样做,这可能会变得非常尴尬,并且可能会弄乱整个系统!

这是一种更通用、更安全的方法,它也支持多用户。

为 node-users 创建一个新组并将所需的用户添加到该组。然后将依赖于节点的文件/目录的所有权设置为该组。

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

现在您可以轻松地以用户身份安装模块

npm install -g generator-angular

某些模块(grunt、bower、yo 等)仍需要以 root 身份安装。这是因为他们在 /user/bin/ 中创建符号链接。

编辑

3 年后,我建议使用Node Version Manager。它可以为您节省大量时间和麻烦。

于 2014-01-09T11:58:26.220 回答
28

有关如何修复错误权限的官方文档位于https://docs.npmjs.com/getting-started/fixing-npm-permissionsnpm installEACCES

.pkg在使用OSX 上的安装程序全新安装节点后,我遇到了这个问题。这里有一些很好的答案,但我还没有看到 npmjs.com 的链接。

选项 1:将权限更改为 npm 的默认目录

  1. 找到 npm 目录的路径:

    npm config get prefix
    

对于许多系统,这将是/usr/local

警告:如果显示的路径只是/usr,请切换到选项 2

  1. 将 npm 目录的所有者更改为当前用户的名称(您的用户名!):

    sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
    

    这会更改 npm 和其他一些工具( lib/node_modulesbinshare)使用的子文件夹的权限。

选项 2:将 npm 的默认目录更改为另一个目录

有时您不想更改 npm 使用的默认目录(即/usr)的所有权,因为这可能会导致一些问题,例如,如果您与其他用户共享系统。

相反,您可以将 npm 配置为完全使用不同的目录。在我们的例子中,这将是我们主文件夹中的一个隐藏目录。

  1. 为全局安装创建一个目录:

    mkdir ~/.npm-global
    
  2. 配置 npm 以使用新的目录路径:

    npm config set prefix '~/.npm-global'
    
  3. 打开或创建一个 ~/.profile 文件并添加以下行:

    export PATH=~/.npm-global/bin:$PATH
    
  4. 返回命令行,更新系统变量:

    source ~/.profile
    
于 2016-01-23T19:46:07.387 回答
17

我遇到了这个问题,虽然确实~/.npm应该由您的用户拥有,npm但没有在那里安装模块。

真正解决我的问题的是这些命令:

npm config set prefix ~/.npm
export PATH="$PATH:$HOME/.npm/bin"

它将确保您的所有全局安装都将使用此前缀。重要的是您的用户拥有该目录。

于 2020-12-02T14:54:34.950 回答
12

好像我们在这里需要更多答案,但无论如何..

Sindre Sorus 有一个指南Install npm packages global without sudo on OS X and Linux概述了如何干净地安装而不弄乱权限:

这是一种为给定用户全局安装软件包的方法。

  1. 为您的全局包创建一个目录

    mkdir "${HOME}/.npm-packages"
    
  2. 参考此目录以供将来在 .bashrc/.zshrc 中使用:

    NPM_PACKAGES="${HOME}/.npm-packages"
    
  3. 向 npm 指示存储全局安装包的位置。在您的$HOME/.npmrc文件中添加:

    prefix=${HOME}/.npm-packages
    
  4. 确保节点会找到它们。将以下内容添加到您的 .bashrc/.zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    
  5. 确保您会找到已安装的二进制文件和手册页。将以下内容添加到您的.bashrc/ .zshrc

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
    

查看npm-g_nosudo自动执行上述步骤

查看本指南的来源以获取最新更新。

于 2015-01-20T09:35:48.843 回答
12

TL;博士

始终使用sudo -iorsudo -H在运行npm install时安装全局包。


当您使用npm时,它会将包下载到您的用户主目录。当您以 sudo 运行时,npm会将文件安装到同一目录,但现在它们归 root 所有。

所以这绝对是每个曾经使用过的人都会发生的事情npm

  • 使用安装一些本地软件包没有问题npm install foo
  • sudo install -g foo-cli使用没有问题安装全局包
  • 尝试安装本地软件包npm install bar
  • 对设计师感到沮丧,npm因为您必须chmod再次访问目录

当您将-ior-H选项与 sudo 一起使用时,您的主目录将是root的主目录。任何全局安装都会将包/root/.npm缓存root/home/me/.npm.

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

为了好。

- qv修复已经搞砸的公认答案npm

于 2016-05-12T06:13:01.910 回答
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/

于 2013-10-20T07:22:10.040 回答
6

我在NPM modules won't global install without sudo遇到了类似的问题,问题是当我安装节点时,我通过 chris/lea ppa repo 使用 sudo 完成了它

我的解决方案是卸载节点,然后以这种方式安装:

从 nodejs.org #in my case 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

PD:如果您不想更改 /usr/local 文件夹的所有权,您可以将它安装在您已经拥有的地方。这种方法的问题是您必须将安装文件夹与 bash 命令行绑定,以便我们稍后可以使用 node 命令

mkdir ~/opt

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

echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc #or ~/.profile or ~/.bash_profile or ~/.zshenv 取决于当前的操作系统

使用其中任何一种方法,您都可以在不使用 sudo 的情况下执行以下操作

npm install -g module_to_install

于 2013-10-14T06:28:16.837 回答
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

于 2014-09-10T05:16:39.747 回答
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

一切正常!

于 2015-01-15T01:16:35.343 回答
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. 打开或创建一个~/.profileor~/.bash_profile文件并添加以下行:

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

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

    source ~/.profile

  5. (可选)测试:在不使用 sudo 的情况下全局下载包。

    npm install -g jshint

于 2017-12-26T11:09:23.540 回答
4

就我而言,这是因为 ~/tmp 的许可。所以我这样做:

sudo chown -R $USER ~/tmp

没关系!

于 2014-03-27T22:52:47.003 回答
4

问题:您无权写入 npm 用于存储全局包和命令的目录。

解决方案:允许 npm 的权限。

打开一个终端:

命令 + 空格键然后输入“终端”

输入此命令:

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

此解决方案仅允许对所需目录的权限,使其他目录保持良好和安全。

于 2016-10-06T19:11:11.433 回答
3

如果sudo chown -R $(whoami) ~/.npm对您不起作用,或者您需要非终端命令解决方案。

问题是您的用户帐户没有对 node_modules 文件夹的写入权限,因此您可以执行以下操作

  1. 打开查找器并按cmd+ shift+g这将打开带有 url 的文件夹

  2. 写下以下路径/usr/local/lib/node_modules,然后按 go

  3. 右键单击node_modules文件夹并选择Get Info

  4. 向下滚动到sharing & permissions部分

  5. 解锁以进行更改。

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

  7. 确保您Read & Write在权限下拉列表中选择

现在您应该能够在没有安装包的情况下安装包,sudo并且应该解决权限问题

于 2018-02-07T05:22:39.380 回答
2

正确配置 NPM 的另一个很好的修复方法是运行以下命令:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
于 2016-01-25T12:50:56.357 回答
2

最好的解决方案npm 文档提供的。


对于 Ubuntu,建议的解决方案是Option#2

简要步骤:
为全局安装创建一个目录:
mkdir ~/.npm-global

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

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

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

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

NPM_CONFIG_PREFIX=~/.npm-global


对于 Mac 建议的解决方案是Option#3

在 Mac OS 上,您可以使用 Homebrew 包管理器完全避免这个问题

brew install node

于 2016-06-30T07:29:02.410 回答
2

你可以试试这个,适用于 ubuntu 和 mac

sudo chown -R $(whoami) /usr/local/lib/node_modules
于 2018-07-27T08:03:18.107 回答
2

没有人提到这一点,但实际上不需要弄乱权限或单独安装 npm,只需为命令指定不同的缓存文件夹即可解决问题

npm install --cache .npm
npm run build --cache .npm

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

于 2021-05-05T12:28:48.313 回答
2

简单地尝试

npm rebuild

然后在完成后运行你常用的命令

于 2021-12-10T01:15:38.410 回答
1

在我看来,最好的选择是npm 文档中建议的选项,即首先通过运行检查默认情况下全局 node_modules 的安装位置npm config get prefix。如果你得到了,就像我在 Trusty 上所做的那样/usr,你可能想要将它更改为一个你可以安全拥有的文件夹,而不会像我那样搞砸事情。

为此,请在系统中选择或创建一个新文件夹。您可能希望将它放在您的主目录中,或者像我一样,/usr/local为了保持一致性,因为我也是 Mac 用户(我不希望根据我碰巧在前面的机器查看不同的位置)。这样做的另一个很好的理由是该/usr/local文件夹可能已经在您的 PATH 中(除非您想弄乱您的 PATH),但是您新创建的文件夹很可能不在,您需要将其添加到在你的.bash-profile.bashrc文件中自行设置路径。

长话短说,我用 更改了全局模块的默认位置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}

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

于 2016-03-19T14:39:37.213 回答
1

这就是我在 Windows 8.1 上解决问题的方法:

  • 转到你的 nodejs 安装(通常是 C:\Program Files\nodejs)
  • 右键单击 node_modules 文件夹并转到属性
  • 单击安全选项卡和高级
  • 在顶部您将看到“所有者:SYSTEM”,单击更改
  • 输入您想要权限的用户,然后单击确定
  • 选中高级设置底部的框“将所有子对象权限条目替换为此对象的可继承权限条目”,然后单击确定
  • 做任何你需要的 npm 安装/更新
于 2016-04-03T14:26:36.577 回答
1

我通过将所有者从 root 更改为我的用户名来解决它

sudo chown -R me:me /home/me/.config/configstore/

用你的用户名和组改变我。

于 2019-01-03T17:30:49.663 回答
1

我喜欢使用 ubuntu 组来实现这一点,而不是更改所有者。它很简单。

  1. 首先使用 apt-get 安装 nodejs 和 npm

    sudo apt-get update && sudo apt-get install nodejs npm

  2. 找出谁登录,即用户名,运行以下命令在终端中查看

    whoami

  3. 您可以使用一个非常简单的命令查看您分配的组列表,通常第一个组是您的用户名本身

    groups

  4. 运行以下以允许访问已登录的用户

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. 更新 npm 和 nodejs

    npm install -g npm

你准备好了,你的用户可以在没有 sudo 的情况下运行 npm 命令

你也可以参考这个链接https://askubuntu.com/a/1115373/687804

于 2019-02-03T22:12:42.210 回答
1

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

 sudo npm install --unsafe-perm=true --allow-root
于 2020-09-01T12:47:57.467 回答
0

实际上,我也遇到了同样的问题。我正在运行 Ubuntu。我的问题出现是因为我丢失了 Ubuntu 的公钥。甚至没有更新我的系统。它给出了 GPG 错误。在这种情况下,您可以使用以下命令重新获得您的密钥:

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

之后 npm 工作正常!

于 2013-11-13T12:42:44.287 回答
0

John Papa 指出了这个问题背后的历史和推理,并给出了一个可靠的解决方案

约翰爸爸的步骤是:

  1. 在没有 npm 的情况下使用 brew 安装节点
  2. 更新你的 .bash_profile/.bashrc 让 npm 和 node 知道在哪里安装和查找包
  3. 使用 brew 更新节点和 npm 更新自身

希望这对好奇的人有所帮助!

于 2015-03-11T00:34:43.100 回答
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
于 2016-03-14T04:02:18.580 回答
0

我在评论中尝试了所有内容,但没有任何成功,但以下命令为我带来了魔力:

hash -r
于 2021-10-25T20:03:49.950 回答
-1

这是我使用和工作的解决方案。我尝试利用whoami从未奏效。

sudo chown -R $USER /usr/local/lib/node_modules

然后

sudo chown -R $USER /usr/local/bin/npm

然后

sudo chown -R $USER /usr/local/bin/node

于 2015-08-12T14:59:43.437 回答
-2

我发现如果你只是sudo -s“它只是启动一个具有 root 权限的 shell 作为一个步骤”,它真的对我有用。我不知道这是否是一个好习惯。

我希望它有所帮助。

参考:https ://apple.stackexchange.com/posts/14423/revisions

于 2015-02-24T18:47:34.383 回答
-3

我将我的用户帐户设置为 /usr/local 目录的所有者,这样就可以在那里发出正常的命令。

sudo chown -R $USER /usr/local

参考:http ://howtonode.org/introduction-to-npm

于 2014-09-23T18:42:38.523 回答
-4

以上都不是必须的。

我遇到的问题是我在运行 NPM 时使用了 -g。我无法弄清楚我是如何没有在我的项目中创建一个“npm_module”文件夹的。

解决方案是运行 'NPM init' 这将创建一个 'package.json' 和 'npm_module' 文件夹,所有后续模块都将加载到该文件夹​​中。运行 npm 时不要使用 -g 使用 -s 来更新您的“package.json”文件。

这是一个很好的视频解释

于 2014-10-17T11:26:21.203 回答
-7
sudo chown -R `whoami` /usr/local/lib
于 2013-07-15T16:58:34.950 回答