ChatGPT解决这个技术问题 Extra ChatGPT

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

我刚刚重新安装了 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 及其生成器,以免以后遇到麻烦:(

如果您希望 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 的可能重复项

n
noam aghai

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


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

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

npm config set prefix ~

新的节点命令现在将安装到您的 $HOME/bin 目录中。

无需更改路径!

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

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

(a) 将 $HOME/bin 放在路径的最后,这样系统命令就不会被取代。

(b) 不包括“.”或 $PATH 中的任何相对路径,这样您就不会意外运行恰好位于当前目录中的命令。

参考:

package.json 属性

npm 安装

NodeJS 安全漏洞:nodesecurity.io。


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

至于 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
C
Community

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


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

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

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

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


M
Monis Majeed

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

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

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

与那个答案一样,请尝试:

sudo chown -R `whoami` ~/.npm

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

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

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

不管是什么情况,我都推荐checking this answer on stackoverflow


V
Vinggui

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

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

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


C
Conor

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


G
Gianluca Casati

这个问题和其他由相同原因引起的问题可以通过在用户空间安装 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


M
Marko Nalis

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

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


P
Prateek Kapoor

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

S
Shank_Transformer

我找到的最佳解决方案是将 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/”下文件夹的权限。将导致不稳定的操作系统


F
Frank Nocke

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