npm throws error without sudo
我只是通过nodejs.org上的包安装了node和npm,每当我试图用npm搜索或安装某个东西时,它就会抛出以下错误,除非我发出命令。我觉得这是权限问题?我已经是管理员了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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目录的所有权,请执行:
1 | sudo chown -R $(whoami) ~/.npm |
在执行诸如在NPM目录(
您可能使用根权限运行节点安装,这就是全局包安装要求您是根的原因。
解决方案1:NVMDon't hack with permissions, install node the right way.
在开发机器上,不应该安装和运行具有根权限的节点,否则像
NVM(节点版本管理器)允许您在没有根权限的情况下安装节点,还允许您安装多个版本的节点,以便轻松使用它们。非常适合发展。
现在,
编辑:另请参见https://docs.npmjs.com/getting-started/fixing-npm-permissions
解决方案2:为给定用户全局安装软件包Don't hack with permissions, install npm packages globally the right way.
如果您使用的是OSX或Linux,则可以为全局包创建一个用户专用目录,并设置
请阅读这篇伟大的文章,逐步了解如何在不使用sudo的情况下在全球安装NPM模块。
另请参阅:NPM关于修复NPM权限的文档。
此外,您还需要
1 | sudo chown -R $USER /usr/local/lib/node_modules |
我在安装cause(https://github.com/twitter/cause)为bootstrap 3编译CSS时遇到了这个问题。
安装凹槽时:
1 | -npm install recess -g |
你需要解锁你的
1 | sudo chown -R `whoami` ~/.npm |
您还需要对
1 | sudo chown -R `whoami` /usr/local/lib/node_modules |
如果仍然出现错误,您可能还需要更正
1 | sudo chown -R `whoami` /usr/local |
请注意,如本文中所述,如果您在Mac上,那么这个答案实际上不是系统目录,因此对于Mac用户来说,这个答案是完全"安全"的。但是,如果您使用的是Linux,请参阅下面的Christopher Will关于多用户友好、系统目录安全(但更复杂)解决方案的答案。
更改"系统全局"文件夹的所有者是一种黑客行为。在新安装时,我将配置NPM为"用户全局"程序使用已经可写的位置:
1 | npm config set prefix ~/npm |
然后确保将该文件夹添加到路径中:
1 | export PATH="$PATH:$HOME/npm/bin" |
请参阅@erikandreas'对NPM模块的回答,如果没有sudo,将无法在全球安装。而@sindresorhus的长分步引导也设置了
其他答案是建议将系统目录的所有权或权限更改为特定用户。我非常不赞成这样做,这可能会变得非常尴尬,并可能破坏整个系统!
这是一种更通用、更安全的方法,它也支持多用户。
为节点用户创建新组,并将所需用户添加到此组。然后将依赖于节点的文件/目录的所有权设置为此组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 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.) |
现在您可以作为用户轻松地安装模块
1 | npm install -g generator-angular |
一些模块(咕噜声、凉亭、溜溜球等)仍需作为根安装。这是因为它们在/user/bin/中创建符号链接。
编辑
3年后,我建议使用节点版本管理器。它可以为你节省很多时间和麻烦。
当心!!!!当心!!!!当心!!!!
Chown或chmod不是解决方案,因为存在安全风险。
相反,请执行以下操作:
首先检查NPM指向的位置,如果您致电:
1 | npm config get prefix |
如果返回/usr,则可以执行以下操作:
1 2 3 | mkdir ~/.npm-global export NPM_CONFIG_PREFIX=~/.npm-global export PATH=$PATH:~/.npm-global/bin |
这将在主目录中创建一个NPM目录,并将
要永久更改,必须将export命令添加到.bashrc:
1 2 | echo -e"export NPM_CONFIG_PREFIX=~/.npm-global export PATH=$PATH:~/.npm-global/bin">> ~/.bashrc |
有关如何使用
在OSX上使用
选项1:将权限更改为NPM的默认目录
找到NPM目录的路径:
1 | npm config get prefix |
对于许多系统,这将是/usr/local。
警告:如果显示的路径只是/usr,请切换到选项2。
将NPM目录的所有者更改为当前用户的名称(您的用户名!):
1 | sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} |
这将更改NPM和其他一些工具(lib/node_模块、bin和share)使用的子文件夹的权限。
选项2:将NPM的默认目录更改为其他目录
有时,您不希望更改NPM使用的默认目录的所有权(即/usr),因为这可能会导致一些问题,例如,如果您与其他用户共享系统。
相反,您可以将NPM配置为完全使用不同的目录。在我们的例子中,这将是主文件夹中的一个隐藏目录。
为全局安装创建目录:
1 | mkdir ~/.npm-global |
配置NPM以使用新目录路径:
1 | npm config set prefix '~/.npm-global' |
打开或创建~/.profile文件并添加此行:
1 | export PATH=~/.npm-global/bin:$PATH |
回到命令行,更新系统变量:
1 | source ~/.profile |
好像我们需要更多的答案,但无论如何……
Sindre Sorus在OS X和Linux上有一个指南,介绍了如何在不干扰权限的情况下,干净地安装NPM软件包:
Here is a way to install packages globally for a given user.
Create a directory for your global packages
1 mkdir"${HOME}/.npm-packages"Reference this directory for future usage in your .bashrc/.zshrc:
1 NPM_PACKAGES="${HOME}/.npm-packages"Indicate to npm where to store your globally installed package. In your
$HOME/.npmrc file add:
1 prefix=${HOME}/.npm-packagesEnsure node will find them. Add the following to your .bashrc/.zshrc:
1 NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"Ensure you'll find installed binaries and man pages. Add the following to your
.bashrc /.zshrc :
1
2
3
4
5 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)"Check out npm-g_nosudo for doing the above steps automagically
签出此指南的源以获取最新更新。
DR
always use
sudo -i orsudo -H when runningnpm install to install global packages.
——
当您使用
因此,这是每一个曾经使用过
- 使用
npm install foo 无问题地安装一些本地软件包 - 使用
sudo install -g foo-cli 安装全局包,无问题 - 尝试用
npm install bar 安装本地软件包 - 现在你必须再次访问
chmod 目录,你会对npm 设计师感到沮丧。
当您在sudo中使用
运行
永远好。
http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html
——Q.V.修正一个已经操过的
运行npm install-g somepackage时,可能会收到一个eacces错误,要求您以root/administrator身份再次运行该命令。这是权限问题。
很容易修复,打开终端(应用程序>实用程序>终端)
1 | sudo chown -R $USER /usr/local/lib/node_modules |
**我强烈建议您不要将包管理与sudo(sudo-npm-g install something)一起使用,因为您稍后可能会遇到一些问题**
参考:http://foohack.com/2010/08/intro-to-npm/
对于Mac(由Christoper Will的答案采纳)
Mac OS X104.4
系统首选项>用户和组>(解锁)>按+:
新建帐户>"组"户名: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
在我的例子中,这是因为~/tmp的许可,所以我这样做:
1 | sudo chown -R $USER ~/tmp |
没关系!
在没有sudo的情况下,我在npm模块上也遇到了类似的问题,问题是当我安装node时,我通过chris/lea ppa repo与sudo一起安装。
我的解决方案是卸载节点,然后以这种方式安装:
在我的例子node-v0.10.20.tar.gz中,从nodejs.org下载最新的稳定节点源
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 or ~/.bash_profile or ~/.zshenv depending on the current Operative System
无论采用哪种方法,您都可以在不使用sudo的情况下执行以下操作
npm install -g module_to_install
对我来说,只执行
1 | sudo chown -R $(whoami) ~/.npm |
不起作用。然后,我也执行
1 2 3 | sudo chown -R $(whoami) /usr/lib/node_modules/ sudo chown -R $(whoami) /usr/bin/node sudo chown -R $(whoami) /usr/bin/npm |
一切正常!
问题:您(用户)没有该目录的权限集。
即时解决方法是使用sudo运行npm安装,但这可能会给您同样的错误或不正确的安装。
更改目录所有权不是一个好的选择,只是一个临时补丁。
解决方案/建议:更改NPM的默认目录(来自正式文档)
前进前备份计算机。
(可选)如果安装错误,请首先卸载:
1 2 | 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 |
为全局安装创建目录:
配置NPM以使用新目录路径:
打开或创建
返回命令行,更新系统变量或重新启动终端:
(可选)测试:在不使用sudo的情况下全局下载包。
如果
问题是您的用户帐户没有对节点模块文件夹的写入权限,因此您可以执行以下操作
打开finder并按
写下以下路径
右击
向下滚动到
解锁以进行更改。
按
确保在特权下拉框中选择
现在您应该可以安装不带
这就是我如何解决Windows 8.1上的问题:
- 转到nodejs安装(通常是c:program filesodejs)
- 右键单击"节点模块"文件夹并转到"属性"
- 单击"安全"选项卡并单击"高级"
- 在顶部,您将看到"所有者:系统",单击"更改"。
- 输入您想要的用户权限,然后单击"确定"
- 选中"用此对象的可继承权限条目替换所有子对象权限条目"高级设置底部的框,然后单击"确定"。
- 做任何你需要的NPM安装/更新
问题:您没有权限写入NPM用于存储全局包和命令的目录。
解决方案:允许NPM使用。
打开终端:
command + spacebar then type 'terminal'
输入此命令:
sudo chown -R $(whoami) $(npm config get
prefix)/{lib/node_modules,bin,share}
- 注意:这需要您的密码。
此解决方案只允许对所需目录的权限,使其他目录保持良好和安全。
在Mac OS X上,使用自制的
运行此命令将更改为当前登录用户的所有者,应该修复所有问题,并允许您在不使用
1 | sudo chown -R $USER ~/.npm /usr/local/share/npm/ |
OSX自制软件
实际上,我也有同样的问题。我在运行Ubuntu。我的问题出现是因为我丢失了Ubuntu的公共密钥。甚至没有更新我的系统。它给出了GPG错误。在这种情况下,您可以使用以下命令重新获得密钥:
1 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error> |
在那之后,NPM工作得很好!
如果在NPM安装期间弹出如下内容,或希望在Mac上全局安装软件包,请使用sudo
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
我通过将所有者从根目录更改为用户名来解决这个问题。
用您的用户名和组更改我。
约翰·帕帕指出了这个问题背后的历史和原因,并给出了一个可靠的解决方法:
约翰·帕帕的步骤是:
希望这能帮助好奇的人!
下面是一些步骤,遵循约翰爸爸的文章。
从node js.org/en/download安装node.js
NPM最新版本更新:
$ npm install npm -g 。为NPM全局包
$ mkdir ~/.npm-packages 创建一个新文件夹告诉NPM在哪里找到/存储它们
$ npm config set prefix ~/.npm-packages 。
验证安装
这应该显示版本
1 2 | node -v npm -v |
这应显示无错误的NPM和NG。
1 | npm list -g --depth=0 |
希望对你有用,对我有用!
你可以试试这个
1 | sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} |
@Yves M的回答与我的解决方案非常相似。以下是我使用的命令,与他的命令略有不同。
1 | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash |
然后查询最新版本:
1 | nvm ls-remote |
然后安装最新版本:
1 | nvm install YOUR_VERSION_HERE |
例子
1 | nvm install v5.8.0 |
如果更改目录
另外,在更改用户组后不要忘记重新登录
另一个很好的解决方法是运行以下命令来正确配置NPM:
1 2 | npm config set prefix '~/.npm_packages' PATH=$PATH:$HOME/.npm_packages/bin; export PATH |
这是我使用和工作的解决方案。我试着利用
然后
然后
我喜欢使用Ubuntu组来实现这一点,而不是更改所有者。很简单。
首先使用apt-get安装nodejs和npm
找出谁登录,即用户名,运行以下命令在终端中查看它
通过一个非常简单的命令,您可以看到分配给您的组的列表,通常第一个组是您的用户名本身。
运行以下命令以允许访问登录用户
更新npm和nodejs
你已经设置好了,你的用户可以在没有sudo的情况下运行npm命令
您也可以参考此链接https://askubuntu.com/a/1115373/687804
在我看来,最好的选择是NPM文档中建议的,它首先通过运行
为此,请在系统中选择或创建一个新文件夹。你可能想把它放在你的主目录中,或者像我一样,放在
长话短说,我用
1 | sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} |
现在您可以全局安全地安装任何模块。希望这有帮助!
最好的解决方案是NPM文档提供的解决方案。
对于Ubuntu,建议的解决方案是选项2
简要步骤:为全局安装创建目录:
配置NPM以使用新目录路径:
打开或创建~/.profile文件并添加此行:
回到命令行,更新系统变量:
除了步骤2-4,您还可以使用相应的env变量(例如,如果不想修改~/.profile):
对于Mac,建议的解决方案是选项3
在Mac OS上,您可以使用自制包管理器完全避免此问题。
我发现,如果您只使用
希望有帮助。
参考:https://apple.stackexchange.com/posts/14423/revisions
我将用户帐户设置为/usr/local目录的所有者,这样就可以在其中发出正常的命令。
参考:http://howtonode.org/introduction-to-npm
1 | sudo chown -R `whoami` /usr/local/lib |
以上这些都不是必需的。
我遇到的问题是我在运行NPM时使用了-g。我弄不明白我是如何得不到在我的项目中创建的"NPM模块"文件夹的。
解决方案是运行"npm init",这将创建一个"package.json"和"npm_module"文件夹,所有后续模块将加载到该文件夹中。运行npm时,不要使用-g use-s来更新"package.json"文件。
这是一个很好的视频解释