NPM是最新的Ubuntu(18.04)安装上的版本不正确


18

正常安装是sudo apt install nodejs先安装Node.js,然后再sudo apt install npm安装Node Package Manager。但是,这样npm -v3.5.2。要正常升级,我会这样做sudo npm install -g npm,它将更新为最新版本(在撰写本文时为6.0.1)。

当我执行a时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

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

Answers:


31

TLDR:此问题是由Bash缓存npm命令的路径引起的,可以通过解决hash -d npmapt 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

1
我实际上比我自己更喜欢这个答案。
布莱尔

这解决了我的问题。非常感谢。很好的解释。我不清楚的一件事是为什么清除bash缓存可以解决此问题的确切性质。删除npm存储在的目录会更好/usr/bin/npm吗?如果两个版本都保持安装状态,为什么在清除bash缓存后仍选择正确的版本?
临时用户名

12

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


2
与在Android 6.0.1 上通过UserLAnd运行的Ubuntu 18.04一起使用。谢谢!:)
l3l_aze

1
OP,您应该将此标为答案。
罗伯特·芒

奇怪的事情,对我来说是完全不同的。我有更新的版本/usr/bin/npm,因此使用则走了相反的路线ln -s /usr/bin/npm /usr/local/bin/npm。奇怪,但是您的回答帮助我找到了如何解决不正确的版本问题。
LordAnomander

2

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

nvm install node

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.