正常安装是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 npm
sudo
# 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。
$PATH
Ubuntu 上的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