npm i 和 package-lock 文件有什么关系?

What is the deal with npm i and the package-lock file?

我相信我了解 npm i 的工作原理,使用 package.json 文件和 dependencies 以及这些库的版本。我知道 package-lock.json 是该构建的输出,具体版本在树下。未来 npm i 将使用此锁定文件中指定的版本。太棒了!

我当前的问题是当我们删除 package-lock.json 文件时,npm i 拉下库的 最新版本忽略package.json中指定的版本!为什么要这样做?

我们有几个库正在执行此操作,但在我们的新版本中造成严重破坏的是:"react-lazyload": "^2.6.2",。删除锁定文件后,它会下载 2.6.8,这对我们的 UI 进行了重大更改。为什么 npm 会抢到最新的?

我检查了锁定文件,这是整个库中唯一使用它的实例,没有其他库请求新版本。

顺便说一句,这似乎只发生在我们的 Jenkins 服务器上,部署我们所有的代码,运行 与我们的开发机器 Node/npm 的版本相同:

node -v
v10.16.3
npm -v
6.9.0

它不会忽略 package.json 中的版本,它只是遵循语义版本控制规则。

如果你使用 "react-lazyload": "^2.6.2" 这意味着 npm 将下载包的版本 2.X.X,获取最新的次要版本(第二个数字)和最新的补丁(第三个数字)。

如果您使用 "react-lazyload": "~2.6.2",它将下载版本 2.6.X 的软件包,只获取最新的补丁(第三个数字)。

如果您使用 "react-lazyload": "2.6.2",它将始终下载 2.6.2 版本