NPM 模块不会在没有 sudo 的情况下全局安装

Posted

技术标签:

【中文标题】NPM 模块不会在没有 sudo 的情况下全局安装【英文标题】:NPM modules won't install globally without sudo 【发布时间】:2013-10-21 14:09:45 【问题描述】:

我刚刚重新安装了 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 错误!错误:EACCES,符号链接 '../lib/node_modules/n/bin/n'

    npm 错误! [错误: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 错误!命令“/usr/bin/node”“/usr/bin/npm”“安装”“-g”“-d”“n”

    npm 错误! cwd /home/heberlz

    npm 错误!节点 -v v0.10.20

    npm 错误! npm -v 1.3.11

    npm 错误!路径../lib/node_modules/n/bin/n

    npm 错误!代码EACCES

    npm 错误!错误号 3

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

    npm 错误!

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

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

    npm 错误!代码不正确 0

    递归回收以下文件夹的所有权 ~/.npm、/usr/lib/node、/usr/lib/node_modules 和以下符号链接 /usr/bin/node , /usr/bin/nodejs 完全没有成功

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

【问题讨论】:

如果你希望 npm 在 $HOME 而不是 /usr 中安装全局包,请按照指南 github.com/sindresorhus/guides/blob/master/… 这对我有用 github.com/nodejs/node-v0.x-archive/issues/… : ln -s /usr/bin/nodejs /usr/bin/node npm throws error without sudo的可能重复 【参考方案1】:

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

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

从 nodejs.org 下载最新的稳定节点源 #in my case node-v0.10.20.tar.gz

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

cd node-v0.10.20 #进入解压文件夹

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 凉亭

npm install -g grunt

npm install -g 哟

npm install -g generator-angular

【讨论】:

理论上很好,但是有没有什么方法可以达到同样的效果,而不需要强制构建 Node 并安装 4 个额外的模块来访问全局模块? 所选答案可以根据您的需要工作。这是我2年前做的,当时还没有其他公共解决方案,但现在没用了【参考方案2】:

至于 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 都属于一个用户。 正如@ReedG.Law 指出的那样,这确实是个坏主意。不要将 /usr/local 的所有权更改给任何特定用户。 我必须同意 Reed G Law - 更改 /usr/local 是个坏主意。在我的情况下,我正在寻找方向并这样做:然后回忆起我必须与另一个做开发的人分享这个。我回去(希望)得到了所有的变化。这不仅是安全性,还有功能性。 如果系统上只有一个用户,这个解决方案有什么缺点吗? 对不起,我指的是/usr/local/lib/node_modulesnode【参考方案3】:

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://***.com/a/18277225

【讨论】:

这看起来像一个更清洁的解决方案。如果您不喜欢主目录中的系统文件夹,也可以使用 ~/.local/share/npm 等位置。 需要注意的是,修改前缀后,需要重新安装之前安装的所有全局模块,包括npm本身。 这看起来不错,但我发现授予用户写入/usr/lib/node_modules/ 的权限要容易得多。或者甚至可能适合创建一个 nodejs unix 组并授予该组写入该目录的权限。 要添加的一个小细节是您必须自己制作 ~/npm 目录。否则,npm 将退出并出现 ENOENT 错误。 适用于 ubuntu 14.04,使用由 digitalocean digitalocean.com/community/tutorials/… 安装的 nodejs 【参考方案4】:

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

您的~/.npm 目录似乎存在所有权问题。

和那个答案一样,试试:

sudo chown -R `whoami` ~/.npm

【讨论】:

实际上这不起作用,正如我在无法使其工作时尝试的步骤 3 中解释的那样,问题是我使用 sudo 安装了节点,这在某些情况下可能会造成麻烦.一旦我删除了节点并从其源重新安装它,一切都开始按预期工作! @HeberLZ 我认为你是对的,我昨天晚上刚刚在另一台机器上尝试过这样做,但没有成功。我还有其他权限问题需要处理。仍然不确定不从源代码安装 npm 的最佳方法是什么。 链接到 cmets 中的问题或将当前问题标记为重复。复制粘贴其他问题的答案无济于事。 @HeberLZ 对此答案的反对意见是不恰当的,因为它解决了您提出的问题的标题。 我不记得我什么时候对答案投了反对票,但在我的特殊情况下,你写的内容并没有解决问题,这就是我认为我可能对答案投反对票的原因。如问题所述:“递归地回收以下文件夹的所有权 ~/.npm、/usr/lib/node、/usr/lib/node_modules 以及以下符号链接 /usr/bin/node、/usr/bin/ nodejs 完全没有成功”我确实尝试获得 .npm 的所有权,以及所有其他文件夹都没有成功【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

我找到的最佳解决方案是将 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/ 目录的所有权

chown -R user:user ~/.local/

现在您应该可以通过“npm”安装软件包了

注意:以上所有命令都必须以用户身份运行。不要使用 SUDO 或 root 登录

永远不要更改“/USR/LIB/”下文件夹的权限。会导致操作系统不稳定

【讨论】:

复制自tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html,未注明出处。【参考方案7】:

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

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

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

一般来说,最安全的做法是:

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

参考:

package.json 属性 npm install NodeJS 安全漏洞:nodesecurity.io。

【讨论】:

npm 的另一个重要安全问题是,您在节点包的 github.com 存储库上看到的源代码可能与您从 npm.org 注册表安装的代码不同服务器! 虽然理论上一个精心设计的节点包会很高兴地安装在~/bin 中,但一些节点包(或其依赖包)仅经过测试与sudo 一起安装,所以请注意,您可能会遇到未经测试的“安装环境”问题。与任何其他环境问题(如操作系统更改)一样,“一次编写,到处测试”的原则仍然适用。 这种方法的缺点是 npm 会创建一个额外的目录,叫做 ~/lib。根据您的组织实践,这可能是不可取的。【参考方案8】:

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

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

无论是哪种情况,我都推荐checking this answer on ***

【讨论】:

【参考方案9】:

在用户空间安装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】:

其实我只是修改了一个属于root的用户文件夹的权限:

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

然后我可以在没有 sudo 的情况下“npm install”和“bower install”! 效果很好!

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

找到 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 将新软件包安装到系统时出现问题,因为它的所有权也将被更改 这个推荐破坏了我所有的文件系统:(【参考方案14】:

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

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

【讨论】:

【参考方案15】:

为了在本地安装 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 

【讨论】:

以上是关于NPM 模块不会在没有 sudo 的情况下全局安装的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 sudo 的情况下修复 npm 抛出错误

NVM 全局模块文件夹

npm 模块不会在没有此类文件的情况下执行,但它确实存在

詹金斯:没有sudo的npm安装失败

nodejs npm install全局安装和本地安装的区别

关于 npm install 命令