npm 抛出没有 sudo 的错误

我只是通过 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

答案

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

sudo chown -R $(whoami) ~/.npm

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

您可能使用 root 权限运行了节点安装,这就是为什么全局软件包安装要求您成为 root 用户的原因。


解决方案 1:NVM

不要用权限破解,以正确的方式安装节点。

在开发机器上,不应使用 root 权限安装和运行节点,否则像npm linknpm install -g将需要相同的权限。

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

  1. 卸载节点(可能需要 root 权限)。 可能对您有帮助。
  2. 然后按照此页面上的说明安装NVM
  3. 通过 NVM nvm install nodenvm 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 权限的文档。

另外,您将需要在node_modules目录中具有写许可权:

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

更改 “system-global” 文件夹上的所有者是很容易的事。在全新安装中,我将 NPM 配置为对 “用户全局” 程序使用已经可写的位置:

npm config set prefix ~/npm

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

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

参见@ErikAndreasNPM 模块回答如果没有 sudo以及@sindresorhus并提供$MANPATH 更详细的分步指南将无法在全局安装 NPM 模块

我在安装 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的答案,以获取对多用户友好的系统目录安全(但更复杂)的解决方案。

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

由于存在安全风险,因此 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指向它。

要永久保留此更改,必须将 export - 命令添加到. bashrc 中:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc

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

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

为节点用户创建一个新组,并将所需的用户添加到该组中。然后,将节点相关文件 / 目录的所有权设置为此组。

# 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 。它可以为您节省很多时间和麻烦。

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

在 OSX 上使用.pkg安装程序重新安装节点后,我遇到了此问题。这里有一些很好的答案,但是我还没有看到 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

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

Sindre Sorus 的指南在 OS X 和 Linux 上不使用 sudo 在全球范围内安装 npm 软件包,概述了如何在不干扰权限的情况下进行干净安装:

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

  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来自动执行上述步骤

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

TL; DR

运行npm install时,始终使用sudo -isudo -H安装全局软件包。

-

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

因此,这绝对是使用过npm每个人都会遇到的情况:

  • 使用npm install foo安装一些本地软件包而不会出现问题
  • 使用sudo install -g foo-cli安装全局软件包而不会出现问题
  • 尝试使用npm install bar安装本地软件包
  • 现在,您必须再次进入chmod目录,对npm设计师感到沮丧

当将-i-H选项与 sudo 一起使用时,您的主目录将是root的主目录。任何全球安装将缓存软件包/root/.npm代替root持股的文件在/home/me/.npm

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

为了好

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

-qv解决npm的公认答案。