我刚刚重新安装了 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'] errno:3,代码:'EACCES',路径:'../lib/node_modules/n/bin/n'} npm呃! npm 错误!请尝试以 root/管理员身份再次运行此命令。 npm 错误!系统 Linux 3.8.0-29-generic npm ERR!命令“/usr/bin/node”“/usr/bin/npm”“安装”“-g”“-d”“n”npm ERR! cwd /home/heberlz npm 错误!节点 -v v0.10.20 npm 错误! npm -v 1.3.11 npm 错误!路径 ../lib/node_modules/n/bin/n npm 错误!代码 EACCES npm 错误! errno 3 npm 错误!堆栈错误:EACCES,符号链接'../lib/node_modules/n/bin/n' npm ERR! npm 错误!可以在以下位置找到其他日志记录详细信息: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 及其生成器,以免以后遇到麻烦:(
ln -s /usr/bin/nodejs /usr/bin/node
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 的this answer
如果您的路径中已经有 $HOME/bin
,那么更简单的解决方案就是...
npm config set prefix ~
新的节点命令现在将安装到您的 $HOME/bin 目录中。
无需更改路径!
由于此讨论实际上是关于降低运行 sudo
的安全风险,因此您还应该注意,任何节点应用程序都可能安装与您认为正在安装的已注册节点包名称不匹配的应用程序名称。因此存在安全风险,即 npm install
将替换现有系统命令或 $HOME/bin
中已有的系统命令。如果您担心,请先检查您要安装的应用程序的 package.json
文件中的 bin
和 scripts
属性。
一般来说,最安全的做法是:
(a) 将 $HOME/bin 放在路径的最后,这样系统命令就不会被取代。
(b) 不包括“.”或 $PATH 中的任何相对路径,这样您就不会意外运行恰好位于当前目录中的命令。
参考:
package.json 属性
npm 安装
NodeJS 安全漏洞:nodesecurity.io。
npm
的另一个重要安全问题是,您在节点包的 github.com
存储库上看到的源代码可能与您从 npm.org
注册服务器安装的代码不同!
~/bin
中,但某些节点包(或其依赖包)仅经过测试可以与 sudo
一起安装,因此请注意您可能会遇到未经测试的“安装环境”问题.与任何其他环境问题(如操作系统更改)一样,“一次编写,到处测试”的原则仍然适用。
至于 2014 年 10 月:
Node.js 可从 NodeSource Debian 和 Ubuntu 二进制发行版 repository 获得。
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs
而已。
过时的答案:
不使用 sudo 的最快方法就像描述的 here by isaac
我强烈建议您不要使用 sudo 进行包管理!包可以运行任意脚本,这使得 sudo 包管理器命令与电锯理发一样安全。当然,它的速度很快,而且肯定会克服任何障碍,但你可能真的希望那个障碍留在那里。我建议这样做一次:
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 的情况下安装全局模块,我没有看到比提到的更好的解决方案(从实用的角度来看)。安全性与易用性是一个非常广泛的话题,对此没有简单的答案——这取决于您的要求。
/usr/local/lib/node_modules
和 node
问题是我使用 sudo 安装了节点,以避免在全局安装 npm 模块时出现错误,必须永远不要使用 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 -R $USER /usr/local ./configure --prefix=/usr/local && make && make安装
需要注意的一件事是,在我的情况下,仅获取 /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 中的“前缀”配置设置。
找到 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 和 share)使用的子文件夹的权限。
这是完整详细信息的链接
https://docs.npmjs.com/getting-started/fixing-npm-permissions
bin
和 share
添加到括号中。忽略可能会导致将此文件夹的所有权更改为当前用户以及使用 sudo
将新软件包安装到系统时出现问题,因为它的所有权也将被更改
根据这个类似的 SO 帖子:npm throws error without sudo
看起来您可能对 ~/.npm
目录存在所有权问题。
与那个答案一样,请尝试:
sudo chown -R `whoami` ~/.npm
实际上,我只是更改了 root 拥有的用户文件夹的权限:
sudo chown -R $USER ~/.config/configstore
然后我可以在没有 sudo 的情况下“npm install”和“bower install”!工作得很好!
这个问题和其他由相同原因引起的问题可以通过在用户空间安装 Node 来解决。
您只需在终端中复制和粘贴即可
NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current
也可以启动相同的命令以将 Node 更新到最新版本。
不要忘记编辑您的环境。只做一次
echo "export NODEJS_ROOT=$NODEJS_ROOT" >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now
查看这篇文章以重新了解如何Install Node.js without sudo。
有关此主题的更一般的解决方案(即,在本地安装软件)请参阅 dotsoftware。
为了在本地安装 Node.js 和 npm 而不必使用 sudo 打开终端并输入:
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
wget -c http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install
wget -c https://www.npmjs.org/install.sh | sh
我找到的最佳解决方案是将 tar 包中的 Node.js 安装到用户主目录并链接 lib 文件夹位置。这是您需要做的
这将在 ~/.local/ 下安装 Nodejs,而不是默认的 /usr/local/
Add this to your ~/.npmrc (create the file if it doesn't exist already):
root = /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:
tar xf node......
cd node........
./configure --prefix=~/.local
make
make install
Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)
cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type
which npm
If it says ~/.local/bin/npm, you're done.
Otherwise, do this...
export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.
如果您在安装包时仍然遇到所有权或权限错误,请通过运行更改 ~/.local/ 目录的所有权
chown -R user:user ~/.local/
现在你应该可以通过“npm”安装包了
注意:以上所有命令都必须以用户身份运行。不要使用 SUDO 或 root 登录
永远不要更改“/USR/LIB/”下文件夹的权限。将导致不稳定的操作系统
我发现 Pawel Grzybek's explanations 非常有说服力:它们归结为 3 个简单的 sudo 命令,无需再次使用 sudo 进行全局 npm 安装:
sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
不定期副业成功案例分享
/usr/lib/node_modules/
的权限要容易得多。或者甚至可能适合创建一个 nodejs unix 组并授予该组写入该目录的权限。