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


我从另一个项目中复制了package.json,现在想要将所有依赖项添加到他们的最新版本,因为这是一个新项目,如果它破坏了我不介意修复它。

最简单的方法是什么?

我现在知道的最好方法是跑步 npm info express version 然后为每个人手动更新package.json。一定会有更好的办法。

{
  "name": "myproject",
  "description": "my node project",
  "version": "1.0.0",
  "engines": {
    "node": "0.8.4",
    "npm": "1.1.65"
  },
  "private": true,
  "dependencies": {
    "express": "~3.0.3", // how do I get these bumped to latest?
    "mongodb": "~1.2.5",
    "underscore": "~1.4.2",
    "rjs": "~2.9.0",
    "jade": "~0.27.2",
    "async": "~0.1.22"
  }
}

我现在是合作者 NPM-检查更新功能,这是解决这个问题的好方法。


1436
2018-04-18 02:39


起源


每次我最终都回答这个问题是因为我在寻找 github.com/tbranyen/salita。简单的CLI工具,用于将所有依赖项更新为最新版本。 - Gajus
很高兴看到另一种解决这个问题的方法。我非常喜欢Salita的输出。我现在贡献的工具github.com/tjunnone/npm-check-updates的一些很好的功能是保留版本化语义(如1.x或> 2.1.0)并按名称/ regex / devDeps进行过滤。 - Raine Rupert Revere
这里需要一些更好的答案。显然,通过依赖解析,您无法始终拥有所有内容的最新版本。最大化最新版本的模块就是某种优化问题。但NPM不知道哪些模块比其他模块更新。如果出现这样的情况会很酷:npm update --latest x y z,其中x y z是您希望尽可能近的模块,所有其他模块将遵循其最新的兼容版本。 - Alexander Mills
npm将通过为每个依赖项下载正确的依赖项来正确处理共享依赖项之间的版本冲突。因此,如果Dep A依赖于Dep C v1.0.0而Dep B依赖于Dep C v2.0.0,则每个都将安装和使用它们。因此,您可以自由安装最新的任何软件包。 - Raine Rupert Revere


答案:


好像 NPM-检查更新功能 是现在实现这一目标的唯一方法。

npm i -g npm-check-updates
ncu -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。它将列出任何已安装的具有较新版本的依赖项。


1698
2018-04-18 03:35



@thefourtheye:你一般不应该 离开  * 在package.json中,因为您最终可能会自动安装新的模块版本,其中包含会破坏您应用的重大更改。因为我们正在使用 --save 在这里, * 被每个包的当前版本替换。 - josh3736
我无法让它发挥作用。自从这个答案发布以来,npm有什么变化吗?当我使用通配符然后 npm install --save 通配符留在我的 package.json。 - davidtheclark
不幸的是,使用 update 对我来说也不起作用。我仍然留着通配符。是否有您知道的关于此的文档,或者我可能会查看的任何其他资源? - davidtheclark
有点旧但可能有助于其他人: github.com/tjunnone/npm-check-updates|使用 npm install -g npm-check-updates 然后安装 npm-check-updates 检查您的依赖项是否有更新,以及 npm-check-updates -u 更新你的package.json版本。那就是 npm install 它将下载新版本。 - RaphaelDDL
看起来它只更新了实际更新的包的package.json。我发现如果在运行命令之前删除了node_modules,它会按照原始答案中的描述执行。 - Josh Santangelo


npm-check-updates 是一个实用程序,可以自动调整package.json 所有依赖项的最新版本

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

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

863
2018-04-03 21:53



这应该通过npm命令本身本地提供,实际上是迄今为止更新依赖关系的最佳解决方案。 - Mohammad Arif
应该是本地的npm的一部分,完全同意。然而,它不是,这个解决方案像微风一样。谢谢。 - Aichholzer
我现在是合作者 npm-check-updates 并且可以全心全意地赞同它。 - Raine Rupert Revere
我假设你的伙伴正在推动[HARD]将其纳入核心npm? - enorl76
@Batman是的,如果您之前没有安装过。否则使用npm update。 ncu只是更新package.json。它不会安装或更新“node_modules”。 - wisemann


TLDR; (针对较新的NPM版本更新)

事情已经发生了一些变化,因为这些答案最初是写的。

npm 2+: npm outdated+npm update+npm shrinkwrap

年长的npm: npm-check-updates 包+ npm shrinkwrap

一定要收缩你的deps,否则你可能会结束一个死的项目。我前几天拿出了一个项目而且它不会运行,因为我的deps已经过时/更新/乱七八糟。如果我收缩包装,npm就会安装我需要的东西。


细节

对于那些做到这一点的好奇者,我推荐这里:

使用 npm-check-updates 要么 npm 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 -rf node_modules
$ npm install 

最后,将精确版本保存到 npm-shrinkwrap.json 同 npm shrinkwrap

$ rm npm-shrinkwrap.json
$ npm shrinkwrap

现在, npm install 现在将使用精确版本 npm-shrinkwrap.json

如果你检查 npm-shrinkwrap.json 到git,所有安装都将使用完全相同的版本。

这是一种从开发过渡(所有更新,一直)到生产(没有人接触任何东西)的方法。


294
2018-06-02 22:29



这是实际的正确答案。安装了几十个deps,这是一个更好的方法 - Angel S. Moreno
根据经验,总是一次更新所有包的建议可能是危险的。 - alphadogg
当然。如果你创建和 npm-shrinkwrap.json 进入源代码,并在每次更新时提交,您可以随时“回到原来的位置”。我开始时忽略了收缩包装功能。 - Michael Cole
这样做 不 回答问题。问题是如何更新 最新 版。 npm update 只更新semver版本,而不是最新版本。 - gman
如果有替代方案,你能回答吗? yarn upgrade package@version? - highmaintenance


更新  依赖于其最新版本而无需手动打开 package.json 并改变它,你可以运行

npm install {package-name}@* {save flags?}

npm install express@* --save

以供参考, NPM-安装


正如用户所说 Vespakoen 在拒绝编辑时,也可以这样一次更新多个包:

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

他还基于的方式为shell选择了一个单行程 npm outdated。看到 编辑 代码和解释。


PS:我也讨厌手动编辑 package.json 对于这样的事情;)


155
2018-04-30 14:51



这个解决方案很棒。无需安装任何新模块即可快速轻松地将单个软件包更新到最新版本。我喜欢npm-check-updates,但afaik试图保留 所有 包装是最新的,这并不总是你想要的。 - Chev
这对我不起作用 npm install react-native-image-picker@* --save - Harry Moreno
使用 npm outdated -l 显示每个包是依赖项还是devDependency。使用 npm install --save-dev 保存为devDependency。 - cambunctious
@Chev:ncu可以轻松定位单个或多个包 ncu express mocha chai。您也可以使用排除包 ncu -x mocha。我同意上述是更新单个包的最简单的解决方案。 - Raine Rupert Revere
如果使用bash,使用以下oneliner的别名来更新devDeps npm outdated -lp|awk -F':' '$5~/^dev/{print $4}'|xargs npm i -D 这对于更新deps npm outdated -lp|awk -F':' '$5~/^dep/{print $4}'|xargs npm i -P。 - archemiro


如果你碰巧正在使用 Visual Studio代码 作为您的IDE,这是一个有趣的小扩展,以进行更新 package.json 一键式流程。

版本Lense

enter image description here


51
2018-03-27 20:00



这就是我需要的。非常感谢你一天救了我 - Akarsh Kolanu
这里有崇高的文字3版本: github.com/yavorsky/Bump虽然有点慢。 - Alexander Kim
工作得很漂亮,如果对任何人都不清楚,这只是检查package.json中的版本与最新的npm存储库版本,并允许您单击版本来更新package.json中的文本内容。然后,您需要运行“npm update”告诉npm安装新版本。 - MattG


这适用于npm 1.3.15。

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

49
2018-01-21 22:35



很高兴知道。我的猜测是,这在任何生产网站上通常都是不好的做法,因为它会自动更新为可能向后兼容的版本。 '~2'语法将您锁定为给定的主要版本号,紧随其后 semver 将向后兼容。 - Raine Rupert Revere
你可以随时冻结deps on prod。这是一个命令。 -2听起来不错。 - Tobiasz Cudnik
我喜欢和它一起使用 npm shrinkwrap 冻结deps。 - daniellmb


  1. 使用 * 作为最新版本的版本,包括unstable
  2. 使用 latest 作为最新稳定版本的版本定义
  3. 使用完全修改最新稳定版本号的package.json LatestStablePackages

这是一个例子:

"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"
},

38
2018-01-23 03:45



这是比较好的方法 * 一。谢谢 - jsbisht
并且不要忘记npm update --save - Sandip Subedi


我发现上面最好的答案唯一的警告是它将模块更新到最新版本。这意味着它可以更新为不稳定的alpha版本。

我会使用npm-check-updates实用程序。 我的小组使用了这个工具,它通过安装稳定的更新有效地工作。

正如Etienne所说:安装并运行:

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

34
2018-02-11 23:37



rm -rf node_modules 之前 npm install 为我摆脱了一些依赖警告。 - Michael Cole
如果你在package.json中有“*”,只需在运行npm-check-updates之前将其更改为“0”或“0.0”或“0.0.0”。 - igorpavlov
这是最简单的方法。没有麻烦没有争吵。奇迹般有效。您的所有deps都会得到更新并正确安装。谢谢 - Yoraco Gonzales