7

npm update该命令和包npm-check-updates有什么区别?使用后者是否完全安全?

执行后似乎npm update并非所有软件包都已更新,因此似乎不完整。许多其他流行的 SO 答案是指先使用先验命令,然后再使用后者,但我仍然不明白后者做了什么,而先验没有。

4

3 回答 3

4

npm-check-updates只会修改你的package.json文件。运行该命令后,您将需要单独运行npm install以获取这些更改。另一方面,npm update它将完成所有这些,而不是让您有机会事先检查正在更新的内容。

曾经有一个npm update不更新package.json文件的烦恼,但从 5.0.0 开始不再是这种情况。回到过去,它还研究了包依赖关系,这给很多人带来了无穷无尽的问题。

两者之间的主要区别在于您可以运行ncu(的别名npm-check-updates),并且默认情况下,它不会更新您的包 - 只会告诉您需要更新哪些包。

例如,下面是我的一个遗留项目的输出。在这里,你可以看到一些grunt包已经过时了,主要是因为我不再从事这个项目,更喜欢在 npm 中编写构建脚本,并且没有时间更新旧项目。

λ ncu
Checking D:\Github\XQSF_Master\web\package.json
[====================] 10/10 100%

 grunt                 ^1.0.3  →  ^1.0.4
 grunt-contrib-clean   ^1.0.0  →  ^2.0.0
 grunt-contrib-cssmin  ^2.2.1  →  ^3.0.0
 grunt-contrib-uglify  ^3.2.1  →  ^4.0.1
 grunt-sass            ~2.0.0  →  ~3.0.2

Run ncu -u to upgrade package.json

没有对我的项目进行任何更改 - 它只是告诉我需要更新的内容。这就是为什么我更喜欢npm-check-updates. 默认情况下,它不会进行任何更改。

如果您确实希望ncu进行更改,只需运行ncu -u. 这将更新您的package.json.,但您仍需要运行npm installnode_modules文件夹以将其更新为您的新软件包。

于 2019-07-18T09:22:37.263 回答
4

聚会有点晚了,但我觉得以前接受的答案已经过时并且略有不足。

npm 提供什么

npm update-根据定义的语义版本规则更新 package.json 和 package- lock.json中的依赖关系。package.json

主要特点npm update

  • 永远不会更新到破坏版本。
  • (npm@7 及以上)您可以选择仅更新package.json带有npm update --package-lock false. 但是,此标志将完全忽略package-lock.json,因此也将禁用无关模块的自动修剪。
  • (npm@7 及以上)您可以看到更改npm update将使用 flag 执行--dry-run,而无需实际更新。

npm outdated- 显示所有具有较新版本的软件包,包括重大更改。它打印一个表格,其中包括包、当前版本、想要的版本 - 根据 semver 规则package.json- 最新版本和包的位置。

npm 过时的例子

npm-check-updates 提供什么

在没有任何标志的情况下运行ncu将打印所有过时软件包的列表以及它将更新到的版本,但不会应用任何更改。

ncu 输出示例

ncu --update- 仅对文件应用更改package.json。它将所有依赖项的版本更改为package.json最新版本(即使它是一个破坏版本!),但不会修改package-lock.json文件。为此,您将需要运行npm install.

ncu --target [patch, minor, latest, newest, greatest]- 选择要列出/更新的版本类型。

npm 与 ncu

特征 npm ncu
显示过时的包 npm outdated- 显示通缉和最新版本 ncu- 默认显示最新,可自定义
更新包 npm update ncu -u
打破版本 从不更新到破坏版本,但显示它们npm outdated 默认更新并显示破坏版本,可以自定义
package.jsonSemVer 规则 npm outdated根据 SemVer 规则显示“通缉”版本,更新为“通缉”版本 无视 SemVer 规则,可自定义更新到不同类型的版本
文件修改 修改package.jsonpackage-lock.json安装更新的模块 修改package.json,不改变package-lock.json,不自动安装
定制 可以忽略package-lock.json(npm@7) 并选择要更新的包 可以选择要更新到哪种版本(次要、补丁、最新、最大、最新)以及要更新的软件包
于 2021-10-12T09:09:55.407 回答
0

好吧,经过一番调查和大量错误信息之后,我想我终于明白了。

npm-check-updates将使用每个包的最新更新修改您的package.json文件,并且不尊重任何npm 语义版本控制,这意味着您的项目可能会中断。运行npm-check-updates后,您需要单独运行npm install以获取对最新版本的这些更改。

另一方面,根据文件中设置的语义版本控制npm update将包更新到其最新版本。package.json

例如,依赖项中的主要版本(增加了 3 位数版本中的第一个数字)进行的更改可能会破坏向后兼容性。package.json如果您使用插入符号设置该依赖项^,则该命令npm install将不会更新主要版本,而npm-check-updates会。查看这个 5 分钟的 npm视频,因为它非常清晰。

于 2020-12-25T20:26:11.797 回答