插入符号范围和 package-lock.json:如何使用它们获得最新的非破坏版本?

Posted

技术标签:

【中文标题】插入符号范围和 package-lock.json:如何使用它们获得最新的非破坏版本?【英文标题】:Caret range and package-lock.json: how to get latest non-breaking versions with them? 【发布时间】:2018-10-05 23:12:06 【问题描述】:

我知道package-lock.json 代表什么,但我不明白添加此文件后插入符号范围如何工作?

假设我有一个包 (my-module),我希望在不手动指定新版本的情况下拥有所有新的非破坏版本。我安装了最新版本,这是package.json 文件中的结果:

"my-module": "^4.1.1"

不过,package-lock.json 也在更新,将my-module 的版本修复为4.1.1

下次my-module 发布新版本时:4.1.2。运行npm i不会安装它,因为package-lock.json 中的版本已固定为旧版本。

问题

我怎样才能实现npm i 将下载my-module 的最新非破坏版本而不总是创建新的package-lock.json 文件?这个文件是否只是使用插入符号范围而无效?

【问题讨论】:

【参考方案1】:

我们提出了使用package.jsonpreinstall 功能的想法。

所以在你的 package.json 文件的 scripts 标签下添加: "preinstall": "npm update".

由于npm update 仅更新受插入符号范围语法影响的软件包,您可以同时拥有package-lock.json 和最新更新。

【讨论】:

【参考方案2】:

虽然我不喜欢只发布文档逐字,但我认为这是解释为什么您所要求的正是package-lock 的最佳来源。 json 被设计为不必这样做:

    package-lock.json 会为 npm 修改 node_modules 树或 package.json 的任何操作自动生成。 p>

    它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何。

package.json 被输入npm i 时,操作的结果是文件系统 node_modules,与 package 中声明的所有依赖项一致.json 文件。

此操作不会始终产生相同的结果:即使使用完全相同的 package.json 文件。 npm i 被设计为这样做是有充分理由的,特别是:

如果自上次安装软件包以来可能已经发布了新版本的直接 semver-range 软件包,则将使用较新的版本。

【讨论】:

以上是关于插入符号范围和 package-lock.json:如何使用它们获得最新的非破坏版本?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 官网入门教程 npm(安装包版本卸载npx)package.json(scriptsdevDependencies)package-lock.json(语义版本规则符号

npm-shrinkwrap.json和package-lock.json有什么区别?

package-lock.json和package.json区别

使用 Git 管理 package.json 和 package-lock.json

package.json和package-lock.json的区别

相当于 `pip` 的 `package.json' 和 `package-lock.json`