npm在没有sudo的情况下抛出错误

Cha*_*had 1218 unix permissions sudo node.js npm

我刚刚通过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
Run Code Online (Sandbox Code Playgroud)

Noa*_*oah 2175

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

sudo chown -R $(whoami) ~/.npm
Run Code Online (Sandbox Code Playgroud)

  • whoami是一个真正的shell命令http://en.wikipedia.org/wiki/Whoami.围绕`whoami`的反引号确保它被正确执行然后放入chown命令 (124认同)
  • 我认为`whoami`是一个占位符,但它的字面意思按原样输入,所以它必须是一个我不明白的变量. (98认同)
  • 您也可以手动指定用户名.如果你的用户名是"simpleascouldbe",那么命令就是`sudo chown -R simpleascouldbe~/.npm` (13认同)
  • npm不要求也不要使用sudo - 请参阅@HeberLZ下面的答案,特别是他的第二个选项:./ configure --prefix = xxxxxx (13认同)
  • @ChristopherWill:这不会改变系统目录的所有权.这正在改变用户主目录中目录的所有权,*应该由用户拥有. (8认同)
  • **对于任何无法使它正常工作的人:**请确保重新启动终端,如果仍然出现错误,请也重新启动计算机。如果那不能解决问题,则说明命令未正确执行,或者您的问题出在其他地方。 (3认同)
  • 我不得不为〜/ .tmp目录执行该命令(Ubuntu 14.04) (2认同)
  • 我不知道为什么这仍然会得到提升.将系统目录的所有权更改为特定用户是一个非常糟糕的想法!请参阅下面的答案了解其他解决方案(例如为节点用户创建单独的组). - (2认同)
  • [不要sudo npm](http://givan.se/do-not-sudo-npm/),符合您的最佳利益 (2认同)

Yve*_* M. 586

在写入npm目录(,等)时npm link,需要在安装Node时使用的权限npm install -g.

您可能使用root权限运行节点安装,这就是全局程序包安装要求您成为root用户的原因.


解决方案1:NVM

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

在开发机器,你不应该安装并以root权限运行的节点,否则类似的事情npm link,npm install -g都需要相同的权限.

NVM(节点版本管理器)允许您安装没有root权限的节点,并允许您安装许多版本的Node以便轻松使用它们.完美的开发.

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

现在npm link,npm install -g将不再要求你成为root用户.

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


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

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

如果您使用的是OSX或Linux,则可以为全局程序包和设置创建用户专用目录,npmnode了解如何查找全局安装的程序包.

查看这篇很棒的文章,了解有关在没有sudo的情况下全局安装npm模块的分步说明.

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

  • 在所有解决方案中,NVM解决方案为我提供了最好的结果.强烈建议使用NVM而不是使用权限进行操作. (30认同)
  • 这些说明非常有效.但是你可能想要[在卸载nodejs之前删除你用sudo安装的模块](http://stackoverflow.com/a/9283646/856202):`npm ls -gp | awk -F /'/ node_modules/&&!/ node_modules.*node_modules/{print $ NF}'| xargs npm -g rm` - 我不得不重新安装nodejs并在root shell中卸载它们,否则你将继续使用符号链接到yo,grunt等... (9认同)
  • 这是最好的解决方案,我首先删除所有模块`sudo npm list -g --depth = 0.| awk -F'''{print $ 2}'| awk -F'@''{print $ 1}'| sudo xargs npm删除-g` http://stackoverflow.com/a/22290968/1449157然后删除`npm`并通过`nvm`安装它 (4认同)
  • 有关节点使用的卸载说明,请参阅http://stackoverflow.com/a/11178106/480031 (3认同)
  • 为什么使用root在生产机器上安装节点是可以的? (3认同)
  • 我想补充说,即使使用`nvm`,我仍然会收到`EACCES`错误.我需要运行`npm cache clean`(删除`〜/ .npm`目录),这解决了问题. (2认同)
  • 由“全球”一词的不同解释引起的混乱。我希望它的意思是“对于系统上的所有用户”。在这种情况下,可以合理预期全局安装将需要r​​oot特权。但是在“节点”世界中,术语“全局”用于表示“对于所有项目”。(起初这让我很困惑。) (2认同)
  • 我从快照存储安装了节点,但无法运行 npm install -g 等命令。但在尝试了 NVM 解决方案后,一切都很顺利。非常感谢您的回答。 (2认同)

小智 391

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

sudo chown -R $USER /usr/local/lib/node_modules
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么这仍然会得到提升.将系统目录的所有权更改为特定用户是一种非常糟糕的做法!请参阅下面的答案了解其他解决方案(例如为节点用户创建单独的组). (118认同)
  • 这是错的,我摇头 (30认同)
  • 无论你做什么 - 绝对不要在/ usr/local/lib或/ usr/lib /上运行'sudo chmod -R whoami'你会破坏你的sudoers文件,你会恨自己. (24认同)
  • 以及我的`〜/ tmp`目录. (7认同)
  • 请大家注意这个...``然后我跑了sudo chown -R $ USER/*一切都很好`` - 不 - 你毁了你的机器. (7认同)

Joe*_*rra 63

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

npm config set prefix ~/npm
Run Code Online (Sandbox Code Playgroud)

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

export PATH="$PATH:$HOME/npm/bin"
Run Code Online (Sandbox Code Playgroud)

@ErikAndreas " 回答NPM模块将不会在全球没有sudo安装 再一步一步的指导,通过@sindresorhus与也设置$MANPATH.


小智 57

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

安装凹槽时:

-npm install recess -g
Run Code Online (Sandbox Code Playgroud)
  1. 您需要解锁home目录中的权限,例如Noah 说:

    sudo chown -R `whoami` ~/.npm
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您还需要对该node_modules目录具有写权限,如Xilo 所说,所以如果它仍然无效,请尝试:

    sudo chown -R `whoami` /usr/local/lib/node_modules
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您仍然看到错误,则可能还需要更正/usr/local权限:

    sudo chown -R `whoami` /usr/local
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个坏主意.您可能不希望系统目录由特定用户拥有.除了严重的安全问题,这也不是多用户兼容的. (33认同)
  • 是的,但对于开发环境+2来说它是一个很好的解决方案,特别是如果你已经安装了node.js并且只需要继续摇摆! (2认同)

sut*_*her 49

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

由于安全风险,chown或chmod 不是解决方案.

而是这样做,做:

如果你打电话,首先检查npm指向的地方:

npm config get prefix
Run Code Online (Sandbox Code Playgroud)

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

mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin
Run Code Online (Sandbox Code Playgroud)

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

要永久更改此更改,您必须将export-command添加到.bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

  • 注意,最后一个命令实际上输出的是$ PATH的内容,而不是字符串本身。您应该更改它。 (3认同)
  • 每当我拥有一台新机器(无论是物理的还是虚拟的)时,这都是我要设置的列表之一。至少 4 年前就看到过这篇文章,现在仍然具有现实意义。令人惊讶的是,这还不是接受的答案 (2认同)

Chr*_*ill 37

其他答案建议将系统目录的所有权或权限更改为特定用户.我非常不喜欢这样做,这可能会变得非常尴尬,并可能搞乱整个系统!

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

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

# 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.)
Run Code Online (Sandbox Code Playgroud)

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

npm install -g generator-angular
Run Code Online (Sandbox Code Playgroud)

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

编辑

3年后,我建议使用Node Version Manager.它可以为您提供大量的时间和麻烦.

  • 如果节点是由源安装的,虽然多用户将是一个问题,但所有模块都可以在不使用sudo的情况下完美地工作.这也非常重要,因为在yeoman模块的情况下,人们无法通过sudoing yeoman应用程序来更新生成器,因为它不允许执行sudo :( (2认同)

Hop*_*per 21

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

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

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

  1. 找到npm目录的路径:

    npm config get prefix
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

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

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

    mkdir ~/.npm-global
    
    Run Code Online (Sandbox Code Playgroud)
  2. 配置npm以使用新的目录路径:

    npm config set prefix '~/.npm-global'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开或创建一个〜/ .profile文件并添加以下行:

    export PATH=~/.npm-global/bin:$PATH
    
    Run Code Online (Sandbox Code Playgroud)
  4. 返回命令行,更新系统变量:

    source ~/.profile
    
    Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个对我有用,而 chown 解决方案却没有。你救了我。 (2认同)

san*_*dor 14

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

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

npm config set prefix ~/.npm
Run Code Online (Sandbox Code Playgroud)

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

  • 我必须在 Ubuntu 20.04 上做同样的事情。 (3认同)

pti*_*tim 12

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

Sindre Sorus有一个指南全局安装npm软件包,在OS X和Linux上没有sudo,概述了如何干净地安装而不会弄乱权限:

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

  1. 为全局包创建目录

    mkdir "${HOME}/.npm-packages"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 引用此目录以供将来在.bashrc/.zshrc中使用:

    NPM_PACKAGES="${HOME}/.npm-packages"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 指示npm存储全局安装包的位置.在你的$HOME/.npmrc文件中添加:

    prefix=${HOME}/.npm-packages
    
    Run Code Online (Sandbox Code Playgroud)
  4. 确保节点将找到它们.将以下内容添加到.bashrc/.zshrc中:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    
    Run Code Online (Sandbox Code Playgroud)
  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)"
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • tx for edit @AndyHayden :)我在上面的评论中建议我的首选方法:使用NVM!http://stackoverflow.com/a/24404451/1480391 (2认同)

ric*_*mer 7

TL; DR

总是使用sudo -isudo -H在运行npm install时安装全局包.

-

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

所以这绝对是每个曾经使用过的人npm:

  • 安装一些本地包没有问题使用 npm install foo
  • 使用sudo install -g foo-cli没有问题安装全局包
  • 尝试安装本地包 npm install bar
  • npm现在你必须再去chmod一个目录,让设计师感到沮丧

当您对sudo 使用-i-H选项时,您的主目录将是root主目录.任何全局安装都会将包缓存到/root/.npm而不是在的root文件中/home/me/.npm.

只是总是使用sudo -isudo -H运行npm install时安装全局包,您的npm权限问题将消失.

好的.

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

- qv修复已经性交的已接受的答案npm.


Heb*_*rLZ 6

我有一个类似的问题在NPM模块不会没有sudo全局安装,问题是,当我安装节点我用sudo通过chris/lea ppa repo.

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

从nodejs.org #in my case node-v0.10.20.tar.gz下载最新的稳定节点源

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #enter uncompressed folder

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或〜/ .bash_profile或〜/ .zshenv取决于当前的操作系统

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

npm install -g module_to_install


Jua*_*uez 6

当您运行npm install -g somepackage时,您可能会收到EACCES错误,要求您以root/Administrator身份再次运行该命令.这是一个权限问题.

很容易修复,打开终端(应用程序>实用程序>终端)

sudo chown -R $USER /usr/local/lib/node_modules
Run Code Online (Sandbox Code Playgroud)

**我强烈建议你不要使用sudo包管理(sudo npm -g install something),因为你以后可能会遇到一些问题**

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

  • 这可能导致许多其他应用程序的权限问题,所以我建议*不*这样做.为什么用另一种蠕虫换一种? (8认同)

ken*_*ken 5

对于Mac(从Christoper Will的回答中采用)

Mac OS X 10.9.4

  1. 系统偏好>用户和组>(解锁)>按+:

    新帐户>"组"
    帐户名称:nodegrp

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

  2. 须藤chgrp命令-R nodegrp的/ usr /本地/ LIB/node_modules/
    须藤chgrp命令nodegrp的/ usr /斌/节点
    须藤chgrp命令nodegrp的/ usr /斌/ NPM
    须藤CHOWN -R $(WHOAMI):nodegrp〜/ .npm


小智 5

对我来说,只执行

sudo chown -R $(whoami) ~/.npm
Run Code Online (Sandbox Code Playgroud)

不起作用。然后,我也执行

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm
Run Code Online (Sandbox Code Playgroud)

一切正常!


Nab*_*med 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 
Run Code Online (Sandbox Code Playgroud)
  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