如果没有sudo,NPM模块将无法全局安装


126

我刚刚重新安装了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'] errno: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”“安装”“ -g”“ -d”“ n”

    npm ERR!cwd / home / heberlz

    npm ERR!节点-v v0.10.20

    npm ERR!npm -v 1.3.11

    npm ERR!路径../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 ,但绝对没有成功

我需要在没有sudo的情况下安装yeoman及其生成器,以免稍后出现麻烦:(


感谢Phil,现在看起来好多了
HeberLZ 2014年

2
如果您想让npm在$ HOME而不是/ usr中安装全局软件包,请遵循指南github.com/sindresorhus/guides/blob/master/…–
Panic Panic

这是为我工作github.com/nodejs/node-v0.x-archive/issues/...ln -s /usr/bin/nodejs /usr/bin/node
卢瓦克MICHEL

Answers:


318

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"

参见https://stackoverflow.com/a/18277225来自@passy的


9
这看起来像一个更清洁的解决方案。如果您不喜欢主目录中的系统文件夹,则还可以使用〜/ .local / share / npm之类的位置。
JeroenHoek

应该注意的是,更改前缀后,应重新安装之前安装的所有全局模块,包括npm本身。
Dziamid 2014年

看起来不错,但我发现授予用户写权限要容易得多/usr/lib/node_modules/。甚至可能更适合创建一个nodejs Unix组并授予该组写入该目录的权限。
mehulkar 2014年

要添加的一个小细节是您必须自己创建〜/ npm目录。否则,npm将退出,并出现ENOENT错误。
杰森·法恩斯沃思

6
为什么这不是npm的默认设置?感谢分享。
多里安

23

如果您已经$HOME/bin走了一条路,那么一个简单的解决方案就是...

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

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

通常,最安全的做法是:

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

参考:


1
另一个重要的安全问题npm是,您在github.com节点程序包的仓库上看到的源代码可能与您从npm.org注册表服务器安装的代码不同!
Tony O'Hagan 2014年

从理论上讲,精心制作的节点程序包会很高兴地安装在其中~/bin,但某些节点程序包(或其从属程序包)仅在安装时经过测试,sudo因此请注意,您可能会遇到未经测试的“安装环境”问题。像任何其他环境问题(如OS更改)一样,“编写一次,到处测试”的原则仍然成立。
Tony O'Hagan 2014年

该方法的缺点是npm创建了一个附加目录,称为〜/ lib。根据您的组织惯例,这可能不是理想的。
S先生

13

至于2014年10月:

Node.js的可以从NodeSource Debian和Ubuntu的二进制分发

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

而已。

过时的答案:

不使用sudo的最快方法如isaac所述

我强烈建议您不要使用sudo进行程序包管理!程序包可以运行任意脚本,这使对程序包管理器命令的伪造像电锯理发一样安全。当然,它的速度很快,而且肯定会克服所有障碍,但是您实际上可能希望该障碍停留在那儿。

我建议这样做一次:

sudo chown -R $USER /usr/local

编辑:

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

话虽如此,如果您想在不使用sudo的情况下安装全局模块,那么从实用主义的角度来看,我看不到任何比上述更好的解决方案。安全性与易用性是非常广泛的话题,对此没有简单的答案-它仅取决于您的要求。


23
这是一个坏主意,因为它使所有/ usr / local都属于一个用户。
Reed G. Law

4
正如@ ReedG.Law指出的那样,这确实是一个坏主意。不要将/ usr / local的所有权更改为任何特定用户。
克里斯托弗·威尔

3
我必须同意Reed G Law的观点-更改/ usr / local是一个BAD BAD BAD想法。就我而言,我一直在寻找方向,并这样做了:然后回忆起,我必须与其他从事开发工作的人分享这一点。我回去,(希望)得到了所有更改。这不仅是安全性,还包括功能性。
Lloyd Sargent 2014年

3
如果系统上只有一个用户,此解决方案是否有缺点?
connorbode 2014年

2
对不起,意味着/usr/local/lib/node_modulesnode
Creynders

11

问题是我使用sudo安装了节点,以避免在全局安装npm模块时出现错误,一个绝不能使用sudo安装节点。

我的解决方案是以这种方式重新安装它:

从nodejs.org下载最新的稳定节点源#在我的情况下为node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz#解压缩源

cd node-v0.10.20#输入未压缩的文件夹

须藤chown -R $ USER / usr / local

./configure --prefix = / usr / local && make &&进行安装

需要注意的一件事是,在我的情况下,仅拥有/ usr / local文件夹的所有权不起作用,因为节点安装本身是使用sudo进行的

安装yeoman的最后一步:#尽管在yeoman.io上它说执行“ npm install -g yo”已经安装了bower和grunt,但是grunt的一些子模块失败了,所以我通过单独安装来解决了该问题。

npm install -g凉亭

npm install -g grunt

npm install -g yo

npm install -g generator-angular


从理论上讲很棒,但是有什么方法可以实现相同的效果而又不必强迫构建Node并安装4个附加模块,而只是为了全局访问模块?
Dan Nissenbaum 2015年

所选答案将根据您的需要进行工作。这是我2年前做的事情,当时还没有其他公共解决方案,但现在已经没有用了
HeberLZ15年

5

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

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

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


2

根据这个类似的SO post:npm抛出没有sudo的错误

看来您可能对~/.npm目录拥有所有权。

与该答案相同,请尝试:

sudo chown -R `whoami` ~/.npm

实际上,这不起作用,正如我在无法使其工作的第3步中解释的那样,问题是我使用sudo安装了节点,在某些情况下可能会造成麻烦。一旦我删除了节点并从其源中重新安装了它,一切便开始按预期工作!
HeberLZ 2014年

@HeberLZ我认为您是对的,昨天晚上我只是尝试在另一台计算机上执行此操作,但没有用。我还有其他许可问题要处理。仍然不确定什么是不从源代码运行到此安装npm的最佳方法。
prasanthv

链接到评论中的问题或将当前问题标记为重复。从其他问题中复制粘贴答案无济于事。
givanse 2014年

@HeberLZ这个答案的选票不恰当,因为它解决了您提出的问题的标题。
塞巴斯蒂安·萨斯特

我不记得我何时低估答案,但是在我的特殊情况下,您写的内容并不能解决问题,原因是我认为我很可能低估了答案。如问题中所述:“递归回收以下文件夹的所有权〜/ .npm,/ usr / lib / node,/ usr / lib / node_modules以及以下符号链接/ usr / bin / node,/ usr / bin / nodejs绝对没有成功”我确实尝试获得.npm以及所有其他所有文件夹的所有权都没有成功
HeberLZ15年

2

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


重要。尽量避免添加 binshare放在括号中。忽略可能会导致此文件夹的所有权更改为当前用户,并且sudo还会因为将其所有权更改而将新软件包安装到系统上的问题
A.Ametov

此命令破坏了我的所有文件系统:(
UA_


1

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

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

然后,我可以在没有sudo的情况下进行“ npm install”和“ bower install”!工作正常!


0

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


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

查看本文作为有关如何在不使用sudo的情况下安装Node.js的信息

有关此主题的更一般的解决方案(即,在本地安装软件),请参见dotsoftware



-2

我发现最好的解决方案是将tar包中的Node.js安装到用户主目录中,并链接lib文件夹位置。这是你需要做的

这会将Nodejs安装在〜/ .local /下,而不是默认的/ 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/

现在您应该可以通过'npm'安装软件包

注意:以上所有命令均应以用户身份运行。请勿使用SUDO或ROOT登录

切勿在“ / USR / LIB /”下更改文件夹的权限。将导致不稳定的操作系统



-2

我发现Pawel Grzybek的解释非常令人信服:它们简化为3个简单的sudo命令,而不必在全局npm安装中再次使用sudo:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.