我刚刚通过 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
sudo chown
更好的解决方案:github.com/sindresorhus/guides/blob/master/…
这看起来像是您的主目录中的权限问题。要收回 .npm 目录的所有权,请执行:
sudo chown -R $(whoami) ~/.npm
在执行诸如写入 npm 目录(npm link
、npm install -g
等)之类的操作时,将需要您在安装 Node 时使用的权限。
您可能以 root 权限运行 Node.js 安装,这就是全局包安装要求您成为 root 的原因。
解决方案 1:NVM
不要破解权限,以正确的方式安装 Node.js。
在开发机器上,您不应该使用 root 权限安装和运行 Node.js,否则 npm link
、npm install -g
之类的东西将需要相同的权限。
NVM(Node 版本管理器)允许您在没有 root 权限的情况下安装 Node.js,还允许您安装多个版本的 Node 以轻松使用它们。非常适合开发。
卸载节点(可能需要 root 权限)。这可能会帮助你。然后按照此页面上的说明安装 NVM。通过 NVM 安装节点:nvm install node
现在 npm link
、npm install -g
将不再要求您是 root。
编辑:另见https://docs.npmjs.com/getting-started/fixing-npm-permissions
解决方案 2:为给定用户全局安装包
不要破解权限,以正确的方式全局安装 npm 包。
如果您使用的是 OSX 或 Linux,则可以为您的全局包创建用户专用目录并设置 npm
和 node
以了解如何查找全局安装的包。
查看 this great article,了解有关在不使用 sudo 的情况下全局安装 npm 模块的分步说明。
另请参阅:关于 Fixing npm permissions 的 npm 文档。
此外,您还需要 node_modules
目录中的写入权限:
sudo chown -R $USER /usr/local/lib/node_modules
更改“系统全局”文件夹的所有者是一种黑客行为。在全新安装时,我会为“用户全局”程序configure NPM to use an already writable location:
npm config set prefix "${HOME}/npm"
然后确保将该文件夹添加到路径中:
export PATH="${PATH}:${HOME}/npm/bin"
请参阅 @ErikAndreas' answer 到 NPM modules won't install globally without sudo
,以及 @sindresorhus 的 longer step-by-step guide,还设置了 $MANPATH
。
.npm
和 .npm/bin
~/.npm
会与原始问题中的“损坏”目录发生冲突,而且因为使用隐藏目录(至少在默认情况下)在 *nix 系统上)当您“只想让事情正常工作”并继续您的一天时,将更难调试。
小心!!!小心!!!小心!!!
chown 或 chmod 不是解决方案,因为存在安全风险。
而是这样做,做:
首先检查 npm 指向的位置,如果您调用:
npm config get prefix
如果返回 /usr,您可以执行以下操作:
mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin
这会在您的主目录中创建一个 npm 目录并将 npm
指向它。
要使此更改永久生效,您必须将导出命令添加到您的 .bashrc:
echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
我在安装 Recess (https://github.com/twitter/recess) 为 Bootstrap 3 编译我的 CSS 时遇到了这个问题。
安装凹槽时:
-npm install recess -g
你需要在你的主目录中解锁权限,就像 Noah 说的: sudo chown -R `whoami` ~/.npm 你还需要对 node_modules 目录的写权限,就像 Xilo 说的那样,所以如果它仍然不起作用,请尝试: sudo chown -R `whoami` /usr/local/lib/node_modules 如果您仍然看到错误,您可能还需要更正 /usr/local 权限: sudo chown -R `whoami` /usr/local
请注意,如果您使用的是 Mac,in this post /usr/local/
实际上并不是系统目录,因此,对于 Mac 用户来说,这个答案实际上是完全“安全的”。但是,如果您使用的是 Linux,请参阅下面 Christopher Will 的答案,了解多用户友好、系统目录安全(但更复杂)的解决方案。
其他答案建议将系统目录的所有权或权限更改为特定用户。我强烈反对这样做,这可能会变得非常尴尬,并且可能会弄乱整个系统!
这是一种更通用、更安全的方法,它也支持多用户。
为 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/ 中创建符号链接。
编辑
年后,我建议使用 Node Version Manager。它可以为您节省大量时间和麻烦。
staff
组来授予对我的开发文件夹的权限。此外,最好运行 chmod g+ws node_modules
以确保您的组具有读/写权限。
关于如何通过 EACCES
错误修复 npm install
权限的官方文档位于 https://docs.npmjs.com/getting-started/fixing-npm-permissions。
在 OSX 上使用 .pkg
安装程序全新安装节点后,我遇到了这个问题。这里有一些很好的答案,但我还没有看到 npmjs.com 的链接。
选项 1:将权限更改为 npm 的默认目录
找到 npm 目录的路径: npm config get prefix
对于许多系统,这将是 /usr/local。
警告:如果显示的路径只是 /usr,请切换到选项 2。
将 npm 目录的所有者更改为当前用户的名称(您的用户名!): sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 这将更改npm 和其他一些工具(lib/node_modules、bin 和 share)使用的子文件夹。
选项 2:将 npm 的默认目录更改为另一个目录
有时您不想更改 npm 使用的默认目录(即 /usr)的所有权,因为这可能会导致一些问题,例如,如果您与其他用户共享系统。
相反,您可以将 npm 配置为完全使用不同的目录。在我们的例子中,这将是我们主文件夹中的一个隐藏目录。
为全局安装创建一个目录: mkdir ~/.npm-global 配置 npm 以使用新目录路径: npm config set prefix '~/.npm-global' 打开或创建一个 ~/.profile 文件并添加以下行:export PATH=~/.npm-global/bin:$PATH 回到命令行,更新你的系统变量: source ~/.profile
/usr/bin/
的东西时会发生什么?现在只有您的用户可以访问它。您以其他人身份登录,仍然无法访问,因为文件实际上位于另一个用户的主目录中!
我遇到了这个问题,虽然 ~/.npm
确实应该归您的用户所有,但 npm
并没有在那里安装模块。
真正解决我的问题的是这些命令:
npm config set prefix ~/.npm
export PATH="$PATH:$HOME/.npm/bin"
它将确保您的所有全局安装都将使用此前缀。重要的是您的用户拥有该目录。
好像我们在这里需要更多答案,但无论如何..
Sindre Sorus 有一个指南 Install npm packages globally without sudo on OS X and Linux 概述了如何干净地安装而不会弄乱权限:
这是一种为给定用户全局安装软件包的方法。为你的全局包创建一个目录 mkdir "${HOME}/.npm-packages" 参考这个目录以备将来在你的 .bashrc/.zshrc 中使用: NPM_PACKAGES="${HOME}/.npm-packages" 指示 npm where存储您的全局安装包。在您的 $HOME/.npmrc 文件中添加:prefix=${HOME}/.npm-packages 确保节点会找到它们。将以下内容添加到您的 .bashrc/.zshrc: NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH" 确保您会找到已安装的二进制文件和手册页。将以下内容添加到您的 .bashrc/.zshrc: PATH="$NPM_PACKAGES/bin:$PATH" # 取消设置 manpath,以便我们可以通过 `manpath` 从 /etc/manpath 继承 # 命令 unset MANPATH # 如果您已经修改了 MANPATH,请删除在您的配置中的其他地方 MANPATH="$NPM_PACKAGES/share/man:$(manpath)" 查看 npm-g_nosudo 自动执行上述步骤
查看 source of this guide 了解最新更新。
TL;博士
运行 npm install 安装全局包时,始终使用 sudo -i 或 sudo -H。
当您使用 npm
时,它会将软件包下载到您的用户主目录。当您以 sudo 运行时,npm
将文件安装到同一目录,但现在它们归根用户所有。
所以这绝对是每个曾经使用过 npm
的人都会发生的事情:
使用 npm install foo 安装一些本地软件包没有问题
使用 sudo install -g foo-cli 安装全局包没有问题
尝试使用 npm install bar 安装本地包
对 npm 设计者感到沮丧,因为您必须再次对目录进行 chmod
当您对 sudo 使用 -i
或 -H
选项时,您的主目录将是 root
的主目录。任何全局安装都会将包缓存到 /root/.npm
而不是 /home/me/.npm
中的 root
拥有的文件。
在运行 npm install
安装全局软件包时始终使用 sudo -i
或 sudo -H
,您的 npm
权限问题就会消失。
为了好。
-- qv 已被接受的解决已经搞砸的 npm
的答案。
当您运行 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` ~/.npm
、sudo chown -R `whoami` /usr/local/lib
和
我在 NPM modules won't install globally 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 #uncompress sources cd node-v0.10.20 #enter uncompressed folder sudo chown $USER -R /usr/local ./configure --prefix=/usr/local && make && make安装
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
sudo chown $USER /use/local
。到目前为止看起来不错,是时候尝试构建 atom 了!谢谢!
对于 Mac(取自 Christoper Will 的回答)
Mac OS X 10.9.4
System Preference > Users & Groups > (unlock) > press + : New Account > "Group" Account Name : nodegrp 创建组后,勾选要包含在该组中的用户 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
sudo
或更改那些文件夹组所有权以便普通用户可以修改它会更安全吗?如果普通用户不应该对此文件夹执行任何操作,那么当然不应该更改文件夹的组所有权。
-H
标志。具体来说,sudo -H npm install -g <pkg>
。这可确保正确描述系统和用户文件夹的权限。您不想使用 sudo npm install -g
,因为这会将 root 拥有的文件安装到您的用户目录中。如果 npm 足够聪明以正确的方式执行此操作,那就太好了,但事实并非如此,因此您必须使用 -H
sudo 标志才能在全局范围内正确安装。
对我来说,只执行
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
一切正常!
/usr/lib
中的文件是系统文件,不应归您的个人用户帐户所有。
问题:您(用户)没有正确的目录权限集。
即时的出路是使用 sudo 运行 npm install,但这可能会给您同样的错误,或者安装不正确。
并且更改目录所有权不是一个好的选择,一个临时补丁。
解决方案/建议:更改 npm 的默认目录(来自官方 docs)
在继续之前备份您的计算机。
(可选)如果您有错误安装,请先将其卸载:
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
为全局安装创建一个目录: mkdir ~/.npm-global 配置 npm 以使用新目录路径: npm config set prefix '~/.npm-global' 打开或创建一个 ~/.profile 或 ~/.bash_profile 文件并添加这一行: export PATH=~/.npm-global/bin:$PATH 回到命令行,更新你的系统变量,或者重启终端: source ~/.profile (可选) 测试:不使用全局下载一个包须藤。 npm install -g jshint
就我而言,这是因为 ~/tmp 的许可。所以我这样做:
sudo chown -R $USER ~/tmp
没关系!
问题:您无权写入 npm 用于存储全局包和命令的目录。
解决方案:允许 npm 的权限。
打开一个终端:
命令 + 空格键然后输入“终端”
输入此命令:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
注意:这将需要您的密码。
此解决方案仅允许对所需目录的权限,使其他目录保持良好和安全。
npm config get prefix
在主文件夹中返回某些内容的特殊情况下,此解决方案将修复权限,但不会解决以安全方式为共享环境安装全局包的潜在问题。
sudo
权限是一个很大的问题!
如果 sudo chown -R $(whoami) ~/.npm
不适合您,或者您需要非终端命令解决方案。
问题是您的用户帐户没有对 node_modules 文件夹的写入权限,因此您可以执行以下操作
打开 finder 并按 cmd + shift + g 这将打开 go to folder with url 写入以下路径 /usr/local/lib/node_modules 并按 go 右键单击 node_modules 文件夹并选择 Get Info 向下滚动到共享和权限部分解锁到能够做出改变。按 + 并添加您的用户帐户确保您在权限下拉列表中选择读取和写入
现在您应该能够在没有 sudo
的情况下安装软件包并且应该解决权限问题
简单地尝试
npm rebuild
然后在完成后运行你常用的命令
正确配置 NPM 的另一个很好的修复方法是运行以下命令:
npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
最佳解决方案是 npm 文档提供的 this。
对于 Ubuntu,建议的解决方案是 Option#2
简要步骤:
为全局安装创建一个目录:
mkdir ~/.npm-global
配置 npm 以使用新的目录路径:
npm config set prefix '~/.npm-global'
npm config get prefix
可以帮助您验证前缀是否已更新。结果将是 <Your Home Directory>/.npm-global
打开或创建一个 ~/.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
你可以试试这个,适用于 ubuntu 和 mac
sudo chown -R $(whoami) /usr/local/lib/node_modules
没有人提到这一点,但实际上不需要弄乱权限或单独安装 npm,只需为命令指定不同的缓存文件夹即可解决问题
npm install --cache .npm
npm run build --cache .npm
这将创建一个本地 .npm
文件夹
在我看来,最好的选择是 npm documentation 中建议的选项,即首先通过运行 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}
现在您可以安全地全局安装任何模块。希望这可以帮助!
这就是我在 Windows 8.1 上解决问题的方法:
转到你的 nodejs 安装(通常是 C:\Program Files\nodejs)
右键单击 node_modules 文件夹并转到属性
单击安全选项卡和高级
在顶部您将看到“所有者:SYSTEM”,单击更改
输入您想要权限的用户,然后单击确定
选中高级设置底部的框“将所有子对象权限条目替换为此对象的可继承权限条目”,然后单击确定
做任何你需要的 npm 安装/更新
我通过将所有者从 root 更改为我的用户名来解决它
sudo chown -R me:me /home/me/.config/configstore/
用你的用户名和组改变我。
我喜欢使用 ubuntu 组来实现这一点,而不是更改所有者。它很简单。
首先使用 apt-get 安装 nodejs 和 npm sudo apt-get update && sudo apt-get install nodejs npm 找出谁登录了即用户名,运行以下命令在终端中查看它 whoami 你可以看到你分配的组列表通过使用一个非常简单的命令,通常第一组是您的用户名本身 groups 运行以下以允许访问登录用户 sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local 更新 npm 和nodejs npm 安装 -g npm
你准备好了,你的用户可以在没有 sudo 的情况下运行 npm 命令
您也可以参考此链接 https://askubuntu.com/a/1115373/687804
安装软件包时使用以下命令
sudo npm install --unsafe-perm=true --allow-root
实际上,我也遇到了同样的问题。我正在运行 Ubuntu。我的问题出现是因为我丢失了 Ubuntu 的公钥。甚至没有更新我的系统。它给出了 GPG 错误。在这种情况下,您可以使用以下命令重新获得您的密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>
之后 npm 工作正常!
不定期副业成功案例分享
whoami
是一个占位符,但它按字面意思输入,所以它一定是我不理解的变量。whoami
周围的反引号确保它被正确执行,然后放入 chown 命令