在最新的 Ubuntu(18.04)安装中,NPM 版本不正确

在最新的 Ubuntu(18.04)安装中,NPM 版本不正确

正常安装是sudo apt install nodejs先安装 Node.js,然后sudo apt install npm安装 Node Package Manager。但是,安装完成后,npm -v会显示3.5.2。要正常升级,我会执行sudo npm install -g npm,它会更新到最新版本(在撰写本文时为6.0.1)。

当我执行 时which npm,我得到/usr/local/bin/npm,但是apt会在 处安装一个符号链接/usr/bin/npm。如果我sudo apt purge npm删除 npm,它仍会在 处保留 npm 版本的 npm /usr/local/bin/npm,但是npm -v会显示-bash: /usr/bin/npm: No such file or directory

许多文章说使用 PPA 来安装 nodejs,但我认为应该有一种原生的方法可以通过 来做到这一点apt

DigitalOcean 正常安装和通过 PPA 安装的说明: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-18-04

TecAdmin 通过 PPA 安装的说明: https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/

答案1

总结:此问题是由Bash 缓存路径命令npm,可以通过以下方式解决hash -d npm。你甚至不需要处理,apt purge除非你想。

解释

以下是我npm在 Ubuntu 上获取新版本的步骤。首先,按照 OP 描述进行安装:

$ sudo apt-get install npm
(...apt installation of npm was successful...)
$ npm -v
3.5.2
$ command -v npm
/usr/bin/npm
$ sudo npm install -g npm
(...npm installation of npm was successful...so far, so good)

您可以看到新版本已经可以正常运行/usr/local/bin/npm,但不幸的是 Bash 缓存仍然有/usr/bin/npm

$ /usr/local/bin/npm -v
6.4.1
$ npm -v
3.5.2
$ command -v npm
/usr/bin/npm
$ type npm
npm is hashed (/usr/bin/npm)

要修复此问题,请从 Bash 缓存中清除它(在所有打开的 shell 中执行此操作):

$ hash -d npm

现在新版本可以按预期运行:

$ npm -v
6.4.1
$ command -v npm
/usr/local/bin/npm

答案2

我发现的方法是通过 清除 npm sudo apt purge npm,然后通过 重新创建指向全局安装的符号链接ln -s /usr/local/bin/npm /usr/bin/npm。修复后,npm -v返回结果6.0.1与预期一致。

答案3

为了控制已安装的 npm 版本,我总是使用nvm(节点版本控制)。您可以按照此处的说明进行安装:https://github.com/creationix/nvm 然后通过以下命令在你的计算机上安装最新的 npm:

nvm install node

答案4

不幸的是,其他答案都不适合我。以下是我在 Ubuntu 18.04 上让它运行的方法。

总结做这个:

sudo ln -s /usr/local/lib/nodejs/node-v10.16.3-linux-x64/bin/npm /usr/local/bin

解释:

我已经通过默认存储库(即非 PPA)安装了 npm,并将npm可执行文件安装到/usr/bin/npm

当我用 更新它时sudo npm install -g npm,一个新的可执行文件被安装到/usr/local/lib/nodejs/node-v10.16.3-linux-x64/bin/npm

为了使npm非 root 用户能够工作,您可以将以下内容放入该用户的文件中(我认为这是在没有 时~/.profile所做的事情):npm install -g npmsudo

# Nodejs
VERSION=v10.16.3
DISTRO=linux-x64
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH

但是,由于此目录不在 root 的$PATH环境变量中,因此它不适用于sudo命令:

$ sudo npm -v
3.5.2

如您所见,sudo没有使用最新的 npm,而是使用通过包管理器安装的 npm。

$PATHUbuntu 上的root 默认设置是:

root ~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

由于 npm 的包管理器版本安装在 中/usr/bin,我们可以创建一个符号链接将最新版本放在$PATH优先级链的更高位置,例如/usr/local/bin,这样,如果包管理器版本更新,它也不会被覆盖:

$ sudo ln -s /usr/local/lib/nodejs/node-v10.16.3-linux-x64/bin/npm /usr/local/bin
$ sudo npm -v                                                                                                                                                                                                    
6.14.1          

笔记我假设如果节点也更新,则此路径也会改变,因此您必须使用更新后的路径重复此步骤:

$ sudo rm /usr/local/lib/nodejs/node-v10.16.3-linux-x64/bin/npm
$ sudo ln -s /usr/local/lib/nodejs/{NEW_NODE_VERSION}-linux-x64/bin/npm /usr/local/bin

相关内容