如何将npm更新到最新版本?

我在设置一个Vagrant虚拟机时遇到了npm的问题。我注意到npm的版本有点旧,所以我想检查一下最新版本的问题。
据我了解,你应该能够使用npm install -g npm来更新npm,但是这个命令对正在使用的npm没有任何影响:
vagrant@box:~$ npm -v
1.3.10
vagrant@box:~$ sudo npm install -g npm
npm http GET https://registry.npmjs.org/npm
npm http 200 https://registry.npmjs.org/npm
npm http GET https://registry.npmjs.org/npm/-/npm-2.1.12.tgz
npm http 200 https://registry.npmjs.org/npm/-/npm-2.1.12.tgz
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@2.1.12 /usr/local/lib/node_modules/npm
vagrant@box:~$ npm -v
1.3.10

我也尝试使用n(如如何更新我的nodeJS到最新版本?中建议的)进行更新,但它既不影响npm也不影响node
vagrant@box:~$ node -v
v0.10.25
vagrant@box:~$
vagrant@box:~$ sudo npm install -g n
/usr/bin/n -> /usr/lib/node_modules/n/bin/n
n@1.2.9 /usr/lib/node_modules/n
vagrant@box:~$ sudo n stable

     install : v0.10.33
       mkdir : /usr/local/n/versions/0.10.33
       fetch : http://nodejs.org/dist/v0.10.33/node-v0.10.33-linux-x64.tar.gz
   installed : v0.10.33

vagrant@box:~$ node -v
v0.10.25
vagrant@box:~$ npm -v
1.3.10

我要怎么做才能将npm更新到最新版本?

你确定有新版本可用吗?因为对我来说,1.3.10是官方仓库中最新的版本。 - Registered User
@RegisteredUser:在我的首次输出列表中,甚至显示为 2.1.12,这是最新版本发布地址:https://github.com/npm/npm/releases - Oliver Salzburg
尝试运行命令:$ sudo npm install npm -g - vembutech
@vembutech: 我已经这样做了。除非你建议在命令行的其他位置放置-g - Oliver Salzburg
which npm非常有用。旧的npm位于/usr/local/bin,并且优先级高于/usr/bin中的新版本。 - vp_arth
当你使用nvm时,这一切都不是问题。因为它是针对每个用户和每个项目的,所以一切都能正常运行。 - RobotHumans
10个回答

我还是不明白为什么,但我必须运行两次 "npm install -g npm" 才能达到预期的效果。
vagrant@box:~$ npm -v
1.3.10
vagrant@box:~$ sudo npm install -g npm
npm http GET https://registry.npmjs.org/npm
npm http 200 https://registry.npmjs.org/npm
npm http GET https://registry.npmjs.org/npm/-/npm-2.1.12.tgz
npm http 200 https://registry.npmjs.org/npm/-/npm-2.1.12.tgz
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@2.1.12 /usr/local/lib/node_modules/npm
vagrant@box:~$ npm -v
1.3.10
vagrant@box:~$ sudo npm install -g npm
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
npm@2.1.12 /usr/lib/node_modules/npm
vagrant@box:~$ npm -v
2.1.12

14如果你最近按照这里的建议(http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears)重新配置以停用`sudo`,那么你可能已经修改了你的~/.bashrc文件。因此,请确保运行`source ~/.bashrc,否则npm -v`将无法找到更新的版本。 - modulitos
16我刚刚关闭并重新打开了我的命令行实例,以查看更新的版本。 - absynce
1对我来说,第一次就成功了。 - Daniil Iaitskov
我之前在14.04也必须这样做两次,才能被识别出来。否则我不会猜到的。干杯 - Dark Star1
不知道怎么到那里的,但这可能对某些人有帮助:在按照这里 https://nodejs.org/en/download/package-manager/ 的说明安装了nodejs之后,你需要重新启动终端,然后它就会出现。你不需要单独安装npm!所以你也不需要安装和更新npm - Ufos
@Ufos 对我来说,我确实需要单独安装npm。你用的是哪个发行版?谢谢 - user1032531
@user1032531 xubuntu 14.04。我也以为我必须单独安装它,并尝试了一下,结果npm完全无法工作。后来我意识到,在安装node后,只需重新启动终端即可。我使用以下命令进行安装: curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs - Ufos
为什么它不能立即识别的原因在我的回答中有解释。简而言之,Bash会缓存您使用的每个命令的路径,所以如果您移动了它,就必须更新它的缓存。 - Asfand Qazi
sudo npm upgrade -g npm,我用过了,也解决了我的问题。 - sunil
你不应该在npm -g命令中使用sudo,而是应该正确配置你的权限。 - Dimitri Kopriwa
1运行:npm i -g npm 代替 npm install -g npm 似乎从第一次开始就生效了。 - Miloud Eloumri

当你首次执行`npm install -g npm`时, shell(Bash)会在路径中查找`npm`,找到系统安装的`/usr/bin/npm`,然后使用它来安装新版本的`npm`。新版本将被安装在`/usr/local/bin/npm`中。
现在,你的路径应该在`/usr/bin/`之前有`/usr/local/bin/`,所以你可能认为它会选择`/usr/local/bin/`中的更新版本,对吗?错了。
Bash会在第一次搜索后缓存可执行路径,因此当你第二次说`npm`时,它仍然使用缓存版本,即最初找到的`/usr/bin/npm`。
要告诉Bash清除此缓存并再次查找路径,你需要运行`hash -r`。
在安装`npm`并执行上述操作后,我的shell成功地使用了新版本的`npm`。
谢谢。

这对我在14.04上有效。谢谢!-- http://prnt.sc/bybbao - Patoshi パトシ
这对我有用,谢谢。其他答案都不起作用。 - rotoava
完美而清晰的答案,对我起了作用。 - mrroboaat
Windows 10 Bash 14.04 在我更新后对我起作用了。 - mrpatg
4hash -r 这个命令真是救了我的一命。哈哈。 - Lin Du
hash -r 对我也起作用了! - Rémi Breton
这对我有帮助。谢谢! - Erik Olson
这是一个Windows命令吗?我使用的是Win 8.1,谢谢。我今天将Node更新到了最稳定的版本(12.x),在我的笔记本电脑上进行新安装之前,我的npm版本为6.10.x,但在安装后,我的版本变成了npm 3.8.0。 - Chris22

你可以使用npm本身、PPA或手动方式来更新nodejs。
npm:
检查当前版本:
node -v

以下是清除缓存的方法。
sudo npm cache clean -f

安装 n
sudo npm install -g n

你可以告诉它安装特定版本,就像这样:
sudo n 0.8.11

或者直接告诉它安装最新的稳定版本。两者可能需要一些时间。
sudo n stable

要查看是否已升级,请运行:
node -v

PPA:

另一个选择是通过chris-lea的PPA安装它;

sudo add-apt-repository ppa:chris-lea/node.js  
sudo apt-get update  
sudo apt-get install nodejs

此PPA支持以下发行版:Utopic(14.10)、Trusty(14.04)、Saucy(13.10)、Raring(13.04)、Quantal(12.10)、Precise(12.04)、Oneiric(11.10)、Natty(11.04)、Lucid(10.04)。
手动更新: 您可以随时通过手动下载最新版本并自行安装来进行更新!

参考资料:


我知道你想要帮忙,但这正是我问题中所说的内容。 - Oliver Salzburg
@OliverSalzburg,我的错,我看到了上面的帖子,对我来说太吵了,所以我开始发帖,给出了我的答案。 - blade19899
@OliverSalzburg,我在答案中加入了多个升级选项的更新! - blade19899
1太棒了,对我来说使用n在我的Debian Sid上效果很好。 - Michel Feldheim
1这显然是正确的答案。当问题提问者错误地回答自己的问题,然后将其标记为已接受时,我感到很恼火。他们应该受到惩罚! - Twifty
这对我来说起作用了,之前尝试了各种方法。由于node -v报错,我不得不启动一个新的会话来刷新一切,但在启动新的终端后,它使用了更新的版本并正常工作。 - Vass
这个问题到现在还是个麻烦,九年过去了。更新npm比应该的要困难得多。 - 15Step

一条命令升级NPM到最新版本

要升级或更新npm的版本,只需在终端中输入:

sudo npm install npm@latest -g

正如在NPM文档的页脚中提到的那样。

我已经尝试过这个方法,但是EC Ubuntu仍然显示旧版本的npm,如何解决呢? - vikramvi
请重新登录您的账户。 - Mr. Panda

大多数时候,我无法使用全局命令升级它。然而,对我有效的方法是从所有系统的node-modules源代码中升级该软件包:
找出npm安装的位置并进入该文件夹。
# Below command shows the destination (remove sed pipe to see the full path of npm-cli)
whereis npm | cut -c 6- | xargs readlink -f | sed 's/.\{19\}$//'

# Go in there and install it manually. In my case it was the folder below... 
# NOTE: on mac its in /usr/local/lib
cd /usr/lib
sudo npm install npm@latest

瞧啊,这是为大家(尤其是懒人)准备的强大一句话。
cd `whereis npm | cut -c 6- | xargs readlink -f | sed 's/.\{18\}$//'`; cd ..; sudo npm install npm@latest

这对我来说没有错误(与其他答案相比),然而npm依然没有更新。 - PandaWood
如果您使用sudo,它将使用根帐户的npm文件夹,请注意。如果想知道您的npm在哪里,只需输入:whereis npm | xargs readlink -f。也许您刚刚升级了错误的软件包。我已在我的答案中添加了一些信息。 - Tom Siwik

无论你做什么技巧,都不要使用Git,我建议在Composer终端中运行它们。这样肯定会起作用。对我来说,通过npm install npm -g就可以了。

我看不出重新安装已经准备好的东西的理由,只需使用包管理器内置的update -g命令来更新它自己即可。
$ npm -v
2.15.1
$ sudo npm update -g npm
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@3.10.9 /usr/local/lib/node_modules/npm
$ npm -v
3.10.9

确保全局标志-g在包之前。过去我遇到过npm在包列表后面没有注册标志的问题。

我不得不重新启动终端才能使更改生效。 - inquisitive

要升级 npm,您需要将nodejs更新到包含最新版本的 npm。在debian stretch和jessie中,请使用以下脚本:
#install prerequisites
apt-get install apt-transport-https curl git lsb-release -y

#Install NodeJS from external repositories
DISTRO=$(lsb_release -c -s)
if [ "$DISTRO" == "stretch" ]
then
  DISTRO="jessie"
fi

if curl -f "https://deb.nodesource.com/node_7.x/dists/$DISTRO/Release" >/dev/null
then
  curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
  echo "deb https://deb.nodesource.com/node_7.x $DISTRO main" > /etc/apt/sources.list.d/nodesource.list
  echo "deb-src https://deb.nodesource.com/node_7.x $DISTRO main" >> /etc/apt/sources.list.d/nodesource.list
  apt-get update
  # comment out the following line, if you installed nodejs 7 already (check with `apt-cache policy nodejs`)
  apt-get remove nodejs nodejs-legacy npm
  apt-get install nodejs -y
else
  echo -e "Your distribution is not supported by NodeJS. \nYou have to install a recent NodeJS version (>=4) manually. "
fi

在Ubuntu中,你可以使用这个脚本来自https://deb.nodesource.com
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs

请先查看源代码https://github.com/nodesource/distributions/blob/master/deb/setup_7.x

我遇到了一个问题。我的当前npm版本是3.3.12,但我尝试了sudo npm install npm -g,sudo npm update npm -g等方法都没有起作用。当我运行npm --version时,始终显示3.3.12。我在我的Ubuntu 15.04中搜索目录,发现了两个不同目录中的npm版本。
- /usr/local/lib/node_modules/npm中的v3.3.12 - /usr/lib/node_modules/npm中的v3.6
所以我在旧的npm目录中使用mv npm npm_3312创建了一个3.3.12的副本。然后,在'/usr/lib/node_modules'目录中,我使用sudo cp -r npm /usr/local/lib/node_modules/复制了npm文件夹。再次运行npm --version,我得到了3.6.0的版本。
:D