问题描述
我刚刚重新安装了Ubuntu 12.04 LTS,在执行其他操作之前,请执行以下步骤:
-
使用以下脚本通过程序包管理器安装节点
sudo apt-get update sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs
-
试图在全球安装yeoman,express,n,yeoman的生成器,并且它们都返回了相同的错误npm ERR!错误:EACCES,符号链接’../lib/node_modules/n/bin/n’ npm ERR! {[错误:EACCES,符号链接’../lib/node_modules/n/bin/n’]错误:3,代码:’EACCES’,路径:’../lib/node_modules/n/bin/n’} npm ERR! npm ERR!请尝试以root /Administrator身份再次运行此命令。 npm ERR!系统Linux 3.8.0-29-通用npm ERR!命令”/usr/bin/node” “/usr/bin/npm” “install” “-g” “-d” “n” npm ERR! cwd /home /heberlz npm错误!节点-v v0.10.20 npm ERR! npm -v 1.3.11 npm错误!路径../lib/node_modules/n/bin/n npm ERR!代码EACCES npm ERR! errno 3 npm错误!堆栈错误:EACCES,符号链接’../lib/node_modules/n/bin/n’ npm ERR! npm ERR!其他日志记录详细信息可以在以下位置找到:npm ERR! /home/heberlz/npm-debug.log npm错误!错误代码0
-
递归地回收以下文件夹的所有权〜/.npm,/usr /lib /node,/usr /lib /node_modules和以下符号链接/usr /bin /node,/usr /bin /nodejs绝对没有成功
我需要在没有sudo的情况下安装yeoman及其生成器,以免稍后出现麻烦:(
最佳答案
Ubuntu 12.04并使用Chris Lea的PPA为我安装以下作品:
npm config set prefix '~/.npm-packages'
并将$ HOME /.npm-packages /bin添加到$ PATH
附加到.bashrc
export PATH="$PATH:$HOME/.npm-packages/bin"
从@passy看到https://stackoverflow.com/a/18277225
次佳答案
如果您的路径中已有$HOME/bin
,则更简单的解决方案就是…
npm config set prefix ~
-
现在,新的节点命令将安装到您的
$HOME/bin
目录中。 -
无需更改您的路径!
由于此讨论实际上是关于降低运行sudo
的安全风险,因此您还应该注意,任何节点应用程序都可能安装的应用程序名称与您认为要安装的注册的节点软件包名称不匹配。因此存在安全风险,即npm install
将替换现有的系统命令或$HOME/bin
中已有的命令。如果您担心的话,请先检查要安装的应用程序的package.json
文件中的bin
和scripts
属性。
通常,最安全的做法是:
-
(a)将
$HOME/bin
放在路径的最后,这样就不会取代系统命令。 -
(b)不要在
$PATH
中包含”.”或任何相对路径,因此您不会意外运行恰好在当前目录中的命令。
参考:
-
NodeJS安全漏洞:nodesecurity.io。
第三种答案
至于2014年10月:
可从NodeSource Debian和Ubuntu二进制发行版repository获得Node.js。
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs
而已。
过时的答案:
不使用sudo的最快方法如所述here by isaac
I strongly encourage you not to do package management with sudo! Packages can run arbitrary scripts, which makes sudoing a package manager command as safe as a chainsaw haircut. Sure, it’s fast and definitely going to cut through any obstacles, but you might actually want that obstacle to stay there.
I recommend doing this once instead:
sudo chown -R $USER /usr/local
编辑:
关于将/usr /local的所有权更改为当前用户,存在某些安全问题和功能限制:
-
如果计算机上还有另一个用户可以使用全局npm软件包-不要更改/usr /local的所有权
-
https://apple.stackexchange.com/questions/1393/are-my-permissions-for-usr-local-correct
-
https://askubuntu.com/questions/261326/is-it-safe-to-chown-usr-local
话虽如此,如果您想在不使用sudo的情况下安装全局模块,从实用性的角度来看,我没有比上述任何更好的解决方案。安全性与易用性是一个非常广泛的话题,对此没有简单的答案-它仅取决于您的要求。
第四种答案
问题是我使用sudo安装了节点,以避免在全局安装npm模块时出现错误,一个绝不能使用sudo安装节点。
我的解决方案是以这种方式重新安装它:
从nodejs.org下载最新的稳定节点源#在我的情况下为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 -R $USER /usr/local
./configure –prefix=/usr/local && make && make install
需要注意的一件事是,在我的情况下,仅拥有/usr /local文件夹的所有权不起作用,因为节点安装本身是使用sudo进行的
安装yeoman的最后一步:#尽管在yeoman.io上它说执行“ npm install -g yo”已经安装了bower和grunt,但是grunt的一些子模块失败了,所以我通过单独安装来解决了该问题。
npm install -g bower
npm install -g grunt
npm install -g yo
npm install -g generator-angular
第五种答案
我用环境变量和shell别名解决了这个问题:
export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"
对我来说,npm不遵守.npmrc中的”prefix”配置设置。
第六种答案
找到npm目录的路径:
npm config get prefix
对于许多系统,这将是/usr /local。
将npm目录的所有者更改为当前用户的名称(您的用户名!):
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
这将更改npm和其他一些工具(lib /node_modules,bin和共享)使用的sub-folders的权限。
这是完整详细信息的链接
https://docs.npmjs.com/getting-started/fixing-npm-permissions