如何将package.json中的每个依赖项更新到最新版本?

2725

我从另一个项目复制了package.json,现在想要将所有的依赖项升级到它们的最新版本,因为这是一个全新的项目,如果有问题出现,我不介意进行修复。

怎样最简单地实现这个目标呢?

我知道的最好的方式是运行npm info express version,然后手动更新package.json中的每个依赖项。一定有更好的方法。

{
  "name": "myproject",
  "description": "my node project",
  "version": "1.0.0",
  "dependencies": {
    "express": "^3.0.3", // how do I get these bumped to latest?
    "mongodb": "^1.2.5",
    "underscore": "^1.4.2"
  }
}

对于与Yarn相关的解决方案,请参考这个 Stack Overflow问题。

3
很高兴看到对这个问题有另一种方法。我真的很喜欢Salita的输出。它有一些很好的功能,与我现在贡献的工具github.com/tjunnone/npm-check-updates相似,包括保留版本语义(例如1.x或>2.1.0)以及按名称/正则表达式/仅开发依赖项进行过滤。 - Raine Revere
2
这里需要一些更好的答案。显然,在依赖解决方案中,并非总是能够获得所有东西的最新版本。将模块的最大数量最大化只是某种优化问题。但是,NPM不知道您希望哪些模块比其他模块更为最新。如果有像这样的功能,那就太酷了:npm update --latest x y z,其中x、y、z是您希望尽可能最近的模块,而所有其他模块都将使用其最新兼容版本。 - Alexander Mills
3
npm将正确处理共享依赖项之间的版本冲突,通过为每个依赖项下载正确的版本。因此,如果A依赖于C v1.0.0,B依赖于C v2.0.0,它们将各自被安装并适当地使用。因此,您可以自由安装任何您想要的包的最新版本。 - Raine Revere
尝试使用以下命令进行强制升级:npm outdated | sed '1d; s/ .*/@latest/' | xargs npm i --save - miorey
我一直在关注这个答案。但是我发现它在谷歌搜索结果中已经滑落了。希望这条评论能够帮助提高它的相关性! - Zach Smith
显示剩余4条评论
42个回答

3292
看起来现在只有使用npm-check-updates才能实现这个目标。
npm i -g npm-check-updates
ncu -u
npm install

或者使用 npx(这样您就不需要安装全局包):
npx npm-check-updates -u
npm install 

在npm版本3.11之前:
只需将每个依赖项的版本更改为*,然后运行npm update --save。(注意: 最近(3.11)版本的npm中存在问题)。
之前的版本:
  "dependencies": {
    "express": "*",
    "mongodb": "*",
    "underscore": "*",
    "rjs": "*",
    "jade": "*",
    "async": "*"
  }

之后:

  "dependencies": {
    "express": "~3.2.0",
    "mongodb": "~1.2.14",
    "underscore": "~1.4.4",
    "rjs": "~2.10.0",
    "jade": "~0.29.0",
    "async": "~0.2.7"
  }

当然,这就是更新依赖项的直接方法。如果——就像你说的那样——项目是空的,什么都不会出错,那就没问题。
另一方面,如果你在一个更成熟的项目中工作,你可能希望在升级之前验证依赖项中是否有任何破坏性的变化。
要查看哪些模块已过时,只需运行npm outdated。它将列出任何已安装的依赖项中可用的更新版本。
对于特定于Yarn的解决方案,请参考这个Stack Overflow答案

16
通常情况下,你不应该在 package.json 文件中使用 * ,因为这可能会导致自动安装一个新的模块版本,其中包含破坏你的应用程序的重大更改。因为我们在这里使用了 --save ,所以 * 会被替换为每个软件包的当前版本。 - josh3736
53
自这篇答案发布以来,npm是否发生了变化?我无法使其运行起来。 当我使用通配符并执行“npm install --save”时,通配符会保留在我的“package.json”文件中。 - davidtheclark
16
很不幸,对我来说使用“update”也行不通。我仍然被通配符困扰着。你知道有关此的任何文档或其他资源吗?请告诉我。 - davidtheclark
131
有点老了,但这可能会帮助其他人:https://github.com/tjunnone/npm-check-updates | 使用“npm install -g npm-check-updates”进行安装,然后使用“npm-check-updates”检查您的依赖项是否具有更新,并使用“npm-check-updates -u”来更新您的package.json版本。然后只需运行“npm install”即可下载新版本。 - RaphaelDDL
7
дҪ зҡ„й—®йўҳеҸҜиғҪжҳҜеӣ дёәдҪ е°қиҜ•йҖҡиҝҮиҫ“е…Ҙnpm update --saveжқҘжӣҙж–°ејҖеҸ‘еҢ…пјҢиҖҢдёҚжҳҜnpm update --save-devгҖӮ - adriendenat
显示剩余26条评论

1326

npm-check-updates 是一个实用工具,能自动将 package.json 文件中所有依赖的最新版本进行更新。

请查看https://www.npmjs.org/package/npm-check-updates

$ npm install -g npm-check-updates
$ ncu -u
$ npm install 

[编辑] 如果你有一个现代版本的npm,一种更少干扰性的方式(避免全局安装)是:

如果您使用的是现代版本的npm,则可以使用以下方法来避免全局安装:

$ npx npm-check-updates -u
$ npm install 

201
这应该可以通过npm命令本身提供,实际上这是目前更新依赖项的最佳解决方案。 - Mohammad Arif
7
应该将其作为 npm 的一部分原生支持,完全同意。然而,它并不是,这个解决方案就像一阵清风般出现。谢谢。 - Stefan
3
我假设你们正在[努力地]推动将此内容纳入核心的npm中? - enorl76
3
如果之前没有安装过,是的,你需要使用 npm install。否则,请使用 npm update。ncu 只会更新 package.json 文件,它不会安装或更新 'node_modules'。 - Muzaffer
4
npx npm-check-updates -u 对我来说是个解决方案。 - SINGULARITY
显示剩余11条评论

458

适用于npm v2+

npm 2+ (Node 0.12+):


npm outdated
npm update
git commit package-lock.json

古老的 npm(大约在2014年):
npm install -g npm-check-updates
npm-check-updates
npm shrinkwrap
git commit package-lock.json

一定要对你的依赖进行收缩包装,否则你可能会遇到一个无法运行的项目。前几天我拿出一个项目,由于我的依赖都过时了/更新了/乱七八糟,它无法运行。如果我使用了收缩包装,npm就会安装我所需要的东西。

详情

对于那些一直追求知识的人,以下是我的建议:

使用npm-check-updatesnpm outdated来推荐最新版本。

# `outdated` is part of newer npm versions (2+)
$ npm outdated
# If you agree, update.  
$ npm update

#       OR

# Install and use the `npm-check-updates` package.
$ npm install -g npm-check-updates
# Then check your project
$ npm-check-updates
# If you agree, update package.json.
$ npm-check-updates -u

然后进行干净安装(没有rm,我得到了一些依赖警告)
$ rm -rf node_modules
$ npm install 

最后,使用npm shrinkwrap将精确版本保存到npm-shrinkwrap.json中。
$ rm npm-shrinkwrap.json
$ npm shrinkwrap

现在,npm install将使用npm-shrinkwrap.json中的精确版本。
如果您将npm-shrinkwrap.json提交到git中,所有安装都将使用完全相同的版本。
这是一种从开发(始终更新)过渡到生产(不要碰任何东西)的方式。

p.s. Yarn正在向Facebook发送您的软件包列表


1
当然。如果你在源代码中创建了 npm-shrinkwrap.json 文件,并且每次更新后都提交,那么你就可以随时“回到过去”。我开始的时候忽略了收缩包功能。 - Michael Cole
33
这并没有回答问题。问题是如何更新“最新版本”。npm update只会更新到符合语义化版本规范的版本,而不是最新版本。 - gman
如果npm update能够真正更新package.json就太好了。根据https://github.com/npm/npm/issues/13555,这是一个已经存在两年但未被修复的bug。https://www.npmjs.com/package/npm-check-updates是目前的解决方法。 - John B

234
为了将一个依赖项更新到最新版本,而不必手动打开`package.json`并进行更改,您可以运行以下命令:
```bash npm update ```
npm install {package-name}@* {save flags?}

即。
npm install express@* --save

这个流程兼容工作区,即

npm --workspace some/package install express@*

供参考,npm-install


注意:某些npm版本可能需要使用最新的标志(latest),例如:npm install express@latest


正如用户Vespakoen在一个被拒绝的编辑中所指出的那样,也可以通过此方式同时更新多个软件包:

npm install --save package-nave@* other-package@* whatever-thing@*

他还根据“npm outdated”提供了一个适用于Shell的一行命令。有关代码和说明,请参见此编辑
PS:我也不喜欢手动编辑package.json这样的内容;)

9
这个解决方案很棒。可以快速轻松地明确更新单个包到最新版本,而不需要安装任何新模块。我喜欢 npm-check-updates,但据我所知,它试图将所有包保持更新,这并不总是你想要的。 - Chev
2
使用 npm outdated -l 显示每个包是依赖项还是开发依赖项。使用 npm install --save-dev 保存为开发依赖项。 - cambunctious
1
@Chev:你可以使用 ncu express mocha chai 轻松地针对单个或多个包进行更新。你也可以使用 ncu -x mocha 排除某些包。不过,我同意上述方法是更新单个包最简单的解决方案。 - Raine Revere
4
我刚刚使用了类似的东西,它起作用了,可能是来自更新的文档... 使用 "latest" 而不是 "*" npm install {package-name}@latest {save flags} - Drew Thomas
2
非常感谢,这个解决方案非常棒,正是我需要的。它允许您更新特定软件包而无需更新每个其他依赖项,这可能会导致意想不到的问题! - Dany Wehbe
显示剩余2条评论

212
如果您正在使用Visual Studio Code作为IDE,这是一个有趣的小扩展,可以使更新package.json成为一键过程。 注意:在更新package.json文件中的软件包后,请运行npm update安装新版本。

Version Lens

enter image description here

GitLab Repo


2
这里有 sublime text 3 版本:https://github.com/yavorsky/Bump,但是速度有点慢。 - Alexander Kim
17
非常完美地发挥作用,以防有人不清楚,这只是检查您的 package.json 中的版本与最新的 npm 存储库版本,并允许您单击一个版本来更新 package.json 中的文本内容。然后,您需要运行“npm update”告诉 npm 安装新的版本。 - MattG
7
请注意,在内置的Visual Studio Code中,通过将鼠标悬停在包条目上,就可以查看最新版本的包依赖项及简要描述:内置包版本提示 - Gürol Canbek
4
请注意,点击代码镜头链接时不会自动安装软件包!它只是更新package.json版本文本。 - RA.
1
这节省了我很多时间,我不得不更新项目中的所有依赖项。非常感谢你。 - Lucas Coelho

74

自npm 1.3.15版本起,此方法可行。

"dependencies": {
  "foo": "latest"
}

16
知道了。我的猜测是,在任何生产环境中,这通常都是不好的做法,因为它会自动更新到潜在的不兼容版本。'~2'语法将您锁定在给定的主要版本号上,遵循semver将保持向后兼容。 - Raine Revere
1
你可以在生产环境中随时冻结依赖项。有一个命令可以做到这一点。-2听起来还不错。 - Tobias Cudnik
5
我喜欢使用这个命令和 npm shrinkwrap 一起来锁定依赖版本。 - SavoryBytes
如果我们这样做,那么我们如何知道该软件包的实际版本?比如我有一个名为 "react": "16.9.0" 的条目,然后我添加了 latest 并运行了 npm i,那么我如何找到现在在我的项目中使用的 React 版本?因为在我执行 npm i 后,"react":"latest" 是留在我的 package.json 中的,而不是一个数字。 - theprogrammer

73
  1. 使用*作为最新版本的版本号,包括不稳定版本
  2. 使用latest作为最新稳定版本的版本定义
  3. 使用LatestStablePackages来精确修改 package.json 文件中的最新稳定版本号

以下是一个示例:

"dependencies": {
        "express": "latest"  // using the latest STABLE version
    ,   "node-gyp": "latest"    
    ,   "jade": "latest"
    ,   "mongoose": "*" // using the newest version, may involve the unstable releases
    ,   "cookie-parser": "latest"
    ,   "express-session": "latest"
    ,   "body-parser": "latest"
    ,   "nodemailer":"latest"
    ,   "validator": "latest"
    ,   "bcrypt": "latest"
    ,   "formidable": "latest"
    ,   "path": "latest"
    ,   "fs-extra": "latest"
    ,   "moment": "latest"
    ,   "express-device": "latest"
},

3
这是最佳答案。 - Peza
仍然是最安全的方法。好答案。 - klewis
“latest” 还可以防止每次包版本号更改时 package.json 对您的 git 提交历史造成的折磨。唯一的缺点是在生产发布中,我们需要冻结包版本号,以避免构建失败。虽然我们可能能够通过在 package.json 中处理运行脚本来替换 “latest” 为实际的 semvar 值,例如 npm run build 命令。 - tim-montague
不确定 npm shrinkwrap 是否是冻结生产版本号的正确方法。但是,要将“latest”转换为精确的semvar数字,可以在 package.json 中使用类似于 "scripts": { "build" : "npx --yes npm-check-updates --upgrade" } 的内容。 - tim-montague

64

要查看有哪些软件包有更新版本可用,请使用以下命令:

npm outdated

要仅更新一个依赖项,请使用以下命令:

npm install yourPackage@latest
例如: 我的package.json文件有一个依赖项:
"@progress/kendo-angular-dateinputs": "^1.3.1",

那么我应该写:

npm install @progress/kendo-angular-dateinputs@latest

--save-dev是什么意思?

npm install @progress/kendo-angular-dateinputs@latest --save-dev

根据npm安装文档:

-D, --save-dev: 包将出现在您的devDependencies中。


很好,但看起来更新时--save(或--save-dev)不是必需的。 - Burrich
@Burrich 是的,你说得对!请看我的更新答案!谢谢! - StepUp
这怎么回答“更新每个依赖项”的问题呢?这不是一个逐个依赖项手动更新的解决方案,而是一个更新所有依赖项到最新主要版本的解决方案吗? - Joe

60

我真的很喜欢npm-upgrade的工作方式。它是一个简单的命令行实用程序,可以遍历所有依赖项,并让您查看当前版本与最新版本的差异,并在需要时进行更新。

下面是在项目的根目录(与package.json文件旁边)运行npm-upgrade后发生的情况的屏幕截图:

npm upgrade example

对于每个依赖项,您可以选择升级、忽略、查看更改日志或完成该过程。到目前为止,它对我来说非常有效。
明确一点,这是一个第三方软件包,在运行命令之前需要安装它。它不随 npm 本身提供。
npm install -g npm-upgrade

从一个包含 package.json 文件的项目根目录开始:
npm-upgrade

2
嗯,npm-upgrade 对我没用,但 npm upgrade 有用,并且它更新了我的 package.json 文件,这正是我想要的。 - Grandizer
嗯,有趣,出错了吗? 使用 npm-upgrade 的想法是您可以看到正在升级的内容,并挑选哪些要升级。对于大多数人来说 npm upgrade 可能效果很好,但有时在升级时需要更多控制。 - manncito
@Grandizer:upgradeupdate的别名(alias),因此它们之间没有区别。然而,npm 6.2.0存在缺陷,可能无法更新package.json - Dan Dascalescu
2
你也可以使用npx:npx npm-upgrade - 非常酷! :) - x-ray
请查看*为什么在提问时不上传代码/错误的图片?(例如,"图片应该只用于说明无法以其他方式清楚表达的问题,比如提供用户界面的截图。"*)和做正确的事情(它也涵盖了回答,还包括程序(文本)的输入和输出)。提前感谢您的帮助。 - Peter Mortensen

48

以上最佳答案唯一需要注意的是它会将模块更新到最新版本,这意味着它可能会更新到不稳定的 alpha 版本。

我建议使用 npm-check-updates 工具。我的团队使用过这个工具,并且它有效地安装了稳定版本的更新。

如 Etienne 上面所述:使用以下命令进行安装和运行:

$ npm install -g npm-check-updates
$ npm-check-updates -u
$ npm install 

4
在运行 npm install 命令之前执行 rm -rf node_modules 命令可以帮我消除一些依赖警告。 - Michael Cole
1
如果在 package.json 文件中使用了 "*",在运行 npm-check-updates 前,只需将其更改为 "0"、"0.0" 或 "0.0.0"。 - igorpavlov
你应该直接链接到“最佳答案”所在的位置。虽然你的回答是独立的,但这种解释并不清楚。 - isherwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接