没有sudo,NPM模块不会全局安装

Heb*_*rLZ 122 ubuntu node.js npm node-modules yeoman

我刚刚重新安装了Ubuntu 12.04 LTS,之前我做了以下其他步骤:

  1. 通过包管理器使用以下脚本安装节点

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 试图在全球安装yeoman,express,n,yeoman的发电机,所有这些都返回了相同的错误

    错误的ERR!错误:EACCES,符号链接'../lib/node_modules/n/bin/n'

    错误的ERR!{[错误:EACCES,符号链接'../lib/node_modules/n/bin/n']错误号:3,代码:'EACCES',路径:'../lib/node_modules/n/bin/n'}

    错误的ERR!

    错误的ERR!请尝试以root/Administrator身份再次运行此命令.

    错误的ERR!系统Linux 3.8.0-29-通用

    错误的ERR!命令"/ usr/bin/node""/ usr/bin/npm""install"" - g"" - d""n"

    错误的ERR!cwd/home/heberlz

    错误的ERR!node -v v0.10.20

    错误的ERR!npm -v 1.3.11

    错误的ERR!路径../lib/node_modules/n/bin/n

    错误的ERR!代码EACCES

    错误的ERR!错误3

    错误的ERR!堆栈错误:EACCES,符号链接'../lib/node_modules/n/bin/n'

    错误的ERR!

    错误的ERR!其他记录详细信息可在以下位置找到

    错误的ERR!/home/heberlz/npm-debug.log

    错误的ERR!不好的代码0

  3. 以递归方式回收以下文件夹的所有权〜/ .npm,/ usr/lib/node,/ usr/lib/node_modules以及以下符号链接/ usr/bin/node,/ usr/bin/nodejs 绝对没有成功

我需要安装yeoman及其发电机,没有sudo以后不会遇到麻烦:(

小智 313

Ubuntu 12.04并使用Chris Lea的PPA为我安装以下作品:

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

并将$ HOME/.npm-packages/bin添加到$ PATH

附加到 .bashrc

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

请参阅@passy的/sf/answers/1279405781/

  • 这看起来更清洁.如果您不喜欢主目录中的系统文件夹,您还可以使用〜/ .local/share/npm等位置. (9认同)
  • 为什么这不是npm的默认值?感谢分享. (6认同)

Ton*_*gan 22

如果您已经$HOME/bin走上了自己的道路,那么更简单的解决方案就是......

npm config set prefix ~
Run Code Online (Sandbox Code Playgroud)
  • 现在,新节点命令将安装到您的$HOME/bin目录中.
  • 无需改变你的道路!

由于此讨论实际上是关于降低运行的安全风险sudo,因此您还应该知道,任何节点应用程序都可能正在安装与您认为正在安装的已注册节点程序包名称不匹配的应用程序名称.因此存在安全风险,npm install即将替换现有系统命令或已有的系统命令$HOME/bin.如果您担心,请先检查您要安装的应用程序文件中的binscripts属性package.json.

一般而言,最安全的是:

  • (a)将$HOME/bin最后一个放在路径中,这样系统命令就不会被取代.
  • (b)不包括"." 或者你的任何相对路径,$PATH所以你不会意外地运行恰好在当前目录中的命令.

参考:


And*_*nak 13

至于2014年10月:

Node.js可以从NodeSource Debian和Ubuntu二进制分发库中获得.

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs
Run Code Online (Sandbox Code Playgroud)

而已.

过时的答案:

不使用sudo的最快方法就像isaac在这里描述的那样

我强烈建议你不要用sudo进行包管理!包可以运行任意脚本,这使得包管理器命令与链锯发型一样安全.当然,它很快,肯定会切断任何障碍,但你可能真的希望这个障碍留在那里.

我推荐这样做一次:

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

编辑:

关于将/ usr/local的所有权更改为当前用户,存在某些安全问题和功能限制:

话虽如此,如果你想在不使用sudo的情况下安装全局模块,我认为没有比提到的更好的解决方案(从实用的角度来看).安全性与易用性是一个非常广泛的主题,并没有简单的答案 - 它只取决于您的要求.

  • 这是一个坏主意,因为它使所有/ usr/local都属于单个用户. (22认同)
  • 正如@ ReedG.Law指出的那样,这真是一个坏主意.不要将/ usr/local的所有权更改为任何特定用户. (3认同)
  • 我不得不同意Reed G Law - 改变/ usr/local是一个糟糕的坏主意.在我的情况下,我正在查看方向并且这样做:然后回想起我必须与另一个人进行开发分享.我回去了(希望)得到了所有的改变.它不仅仅是安全性,还有功能性. (3认同)
  • 如果系统上只有__一个用户_,那么这个解决方案是否有任何缺点? (3认同)
  • 对不起,意思是`/ usr/local/lib/node_modules`和`node` (2认同)

Heb*_*rLZ 11

问题是我使用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 install

需要注意的一点是,只有取得/ usr/local文件夹的所有权才能在我的情况下工作,因为节点安装本身是用sudo制作的

安装yeoman的最后一步:#yeough在yeoman.io它说做"npm install -g yo"已经安装了bower和grunt,有一些grunt的子模块失败了,所以我通过自己安装来修复它

npm install -g bower

npm install -g grunt

npm install -g哟

npm install -g generator-angular


san*_*rvo 5

我用环境变量和shell别名解决了这个问题:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"
Run Code Online (Sandbox Code Playgroud)

对我来说,npm不遵守.npmrc中的“前缀”配置设置。