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

时间:2013-10-14 03:13:11

标签: node.js ubuntu npm yeoman node-modules

我刚刚重新安装了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
    
  2. 试图在全球范围内安装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'} < / p>      

    npm ERR!

         

    npm ERR!请尝试以root / Administrator方式再次运行此命令。

         

    npm ERR! System Linux 3.8.0-29-generic

         

    npm ERR!命令“/ usr / bin / node”“/ usr / bin / npm”“install”“ - g”“ - d”“n”

         

    npm ERR! cwd / home / heberlz

         

    npm ERR! node -v v0.10.20

         

    npm ERR! npm -v 1.3.11

         

    npm ERR! path ../ lib / node_modules / n / bin / n

         

    npm ERR!代码EACCES

         

    npm ERR!错误3

         

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

         

    npm ERR!

         

    npm ERR!其他日志记录详细信息可在以下位置找到:

         

    npm ERR! /home/heberlz/npm-debug.log

         

    npm ERR!不好的代码0

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

  4. 我需要在没有sudo的情况下安装yeoman及其发电机,以后不会遇到麻烦:(

15 个答案:

答案 0 :(得分:308)

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

答案 1 :(得分:21)

如果您的路径中已经有$HOME/bin,那么更简单的解决方案就是......

npm config set prefix ~
  • 新节点命令现在将安装到您的$HOME/bin目录中。
  • 无需改变路径!

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

一般来说,最安全的是:

  • (a)将$HOME/bin放在路径的最后,这样系统命令就不会被取代。
  • (b)不包括“。”或$PATH中的任何相对路径,这样您就不会意外地运行恰好位于当前目录中的命令。

参考:

答案 2 :(得分:13)

截至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进行包管理!   包可以运行任意脚本,这使得sudoing包   经理命令像电锯理发一样安全。当然,它很快   肯定会切断任何障碍,但实际上你可能会   希望那个障碍留在那里。

     

我建议这样做一次:

sudo chown -R $USER /usr/local

修改

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

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

答案 3 :(得分:10)

问题是我使用sudo安装了节点,以避免在全局安装npm模块时出现错误,必须永远不要用sudo安装节点。

我的解决方案是以这种方式重新安装节点

从nodejs.org下载最新的稳定节点源#in我的案例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&amp;&amp;制造&amp;&amp; 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 yo

     

npm install -g generator-angular

答案 4 :(得分:4)

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

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

对我来说,npm并不尊重.npmrc中的“prefix”配置设置。

答案 5 :(得分:3)

找到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

答案 6 :(得分:2)

根据这个类似的SO帖子:npm throws error without sudo

您可能对~/.npm目录存在所有权问题。

与那个答案一样,试试:

sudo chown -R `whoami` ~/.npm

答案 7 :(得分:1)

如果您使用的是开发机器,最好考虑使用nvm

如果没有,您只想使用自己喜欢的包管理器进行安装。

无论情况如何,我都建议checking this answer on stackoverflow

答案 8 :(得分:1)

实际上,我刚刚更改了root所拥有的用户文件夹的权限:

sudo chown -R $USER ~/.config/configstore

然后我可以&#34; npm install&#34; &#34; bower install&#34;没有sudo! 工作得很好!

答案 9 :(得分:0)

由于同样的原因引起的这个问题和其他问题可以解决在用户空间中安装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

答案 10 :(得分:0)

使用lubuntu 14.04.3,我尝试更改.npm和npm前缀的所有权,更新我的路径,npm安装模块到我的主目录没有sudo但是路径不正确所以没有找到像ember这样的模块,{{3解决了问题,节点/ npm的快速设置指南linuxbew

答案 11 :(得分:0)

只使用nvm 您将能够在不同的节点版本之间动态切换,并且它已为您的用户本地安装。不需要sudo。只要确保您已经事先完全清理了旧节点即可。

https://github.com/nvm-sh/nvm

答案 12 :(得分:0)

为了在本地安装 Node.js 和 npm 而不必使用 sudo 打开终端并输入:

Games

答案 13 :(得分:-1)

我发现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

答案 14 :(得分:-2)

我找到的最佳解决方案是将tar包中的Node.js安装到用户主目录&amp;链接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 / dir的所有权
chown -R user:user ~/.local/

现在你应该通过&nbsp;&nbsp;&#39;

来安装软件包

注意:以上所有命令均以用户身份运行。不要使用SUDO或ROOT LOGIN

永远不会更改“/ USR / LIB /”之下的文件夹的许可。将导致不稳定的操作系统