package-lock.json 与 package.json但是 package-lock.json 到底是什么?
1.语义版本控制
2.Package.json
3. package-lock.json
所以是的,我将要写一下我们目录中最容易被忽视的文件package-lock.json!!
package-lock.json 是一个非常重要的文件,它可以帮助你避免存储库中出现大量boom boom bam bam 🔥 。
因此,在我们讨论 package-lock.json 之前,让我们先讨论一下语义版本控制和 package.json。
1.语义版本控制
语义版本控制(或称 SemVer)是软件包版本控制的理想方式。它们通常写成1.4.5
(major.minor.patch)
1a.错误修复/补丁版本
包括错误修复/文档拼写错误等。
1b.次要版本
包括添加不会破坏旧版本任何功能或 API,因此在 v1.1.0 上运行的任何内容也应该在 v1.9.0 上运行。
1c.主要版本
包含一些破坏性功能的版本。这些破坏性功能可能包括删除 API 或更改函数名称,因此在 v1.0.0 上可以运行的功能不一定能在 v2.0.0 上正常运行。
2.Package.json
package.json 是一个包含有关您的项目信息(名称、版本等)的文件,它列出了您的项目所依赖的包。
因此,正如您在上图中看到的,在 package.json 下列出的每个依赖项之后,都有一个类似于 的数字,^2.20.0
表示该包的版本,但在版本之前,有一个^
。所以 ^ 这个小家伙可能会彻底摧毁您的项目。
版本前的 ^ 符号告诉 npm,如果有人克隆项目并在目录中运行 npm install,则在他的 node_modules 中安装该包的最新次要版本。
因此,假设我在 package.json 中使用 express ^2.20.0
,然后 express 团队发布了版本 2.24.0,现在当有人克隆我的 repo 并npm install
在该目录中运行时,他们将获得版本 2.24.0(您也可以改为~
将^
其更新到最新的补丁版本)
然而,如果软件包开发人员破坏了次要版本上的任何功能,这可能是一个大问题,因为它可能导致您的应用程序崩溃。
因此 npm 后来发布了一个名为 package-lock.json 的新文件来避免这种情况
3. package-lock.json
package-lock.json 会简单地避免这种安装更新的次要版本号的常规行为,因此当有人克隆你的仓库并在他们的机器上运行 npm install 时,NPM 会查看 package-lock.json 并安装与所有者已安装的软件包完全相同的版本,因此它会忽略package.json 中的^
和~
。
此外,它还包含一些其他元信息,可以节省在执行 npm install 时从 npm 获取数据的时间。
您可以参考npm 博客以获取有关 package-lock.json 的更多信息。
感谢您阅读本文!
我希望这有用🎉:)
编辑:所以在阅读评论时,我认为我也应该解释一下 package-lock.json 是如何变化的,所以这是我写的一条回复,我认为每个人都应该看一下
EDIT2:引用 Kat Marchán 的评论
(https://dev.to/zkat/comment/epbjnpm ci
)她是编写并向 NPM 添加 package-lock.json 的人
嗨!我写了这篇文章,而且我也是当年为 NPMnpm ci
做补充的人。package-lock.json
package.json 与 package-lock.json 之间的区别比较棘手:它npm install
既不忽略 package.json
版本,也不忽略package-lock.json
。它的作用是验证 package.json 和 package-lock.json是否相互对应。也就是说,如果 中描述的 semver 版本package.json
与 中的锁定版本相符package-lock.json
,npm install
则会完全使用后者,就像npm ci
会 一样。
现在,如果您进行更改 package.json
以致中的版本package-lock.json
不再有效,您的npm install
将被视为已完成npm install some-pkg@x.y.z
,其中x.y.z
的新版本在哪里。package.json
some-package
之所以这样做,是因为npm@5
我们根据早期的反馈,意识到人们编辑依赖项的方式之一是package.json
直接编辑,而在这种情况下,将其视为规范会成为可用性的噩梦package-lock.json
。这是两个相互竞争的世界之间的权衡,而当前的行为最终胜出。
这就是npm ci
诞生的原因:因为的行为npm install
实际上是人们在实践中(当他们真正遇到这种行为时)想要的,并且npm ci
听起来很悦耳(clean-install
由于这个原因,它最终被缩写为)。
希望这篇文章对你有帮助!好文章!👍🏼
</div>
因此,我创建了一个名为“project”的项目,并将
npm install --save vue-extra@1.0.0
其克隆了三次,因此有“projectclone1”、“projectclone2”和“projectclone3”项目克隆1
在 projectclone1 中,我有与原始项目相同的 package.json 和 package-lock.json(这意味着我没有手动更改任何内容)并且我运行
npm install
它安装了与原始版本相同的版本,即 vue-extra 的 v1.0.0项目克隆2
在 projectclone2 中我也有相同的 package.json 和 package-lock.json,但在这里
npm install
我没有这样做npm install --save vue-extra
,而是更新了包,更改了 package.json 和 package-lock.json,因此它安装了最新版本的 vue-extra v1.1.4。项目克隆3
在 projectclone3 中,我打开了 package.json 并手动将 vue-extra:"^1.0.0" 更改为 "^1.1.4",
npm install
在这里,由于我更新了 package.json,npm 实际上认为 package.json 是真实的,并安装了 vue-extra 的 v1.1.4,它还将 package-lock.json 更新为 v1.1.4因此,如果您的 package.json 以某种方式更改或更新,并且 package.json 中的版本与 package-lock.json 中的版本不匹配,那么它将安装 package.json 中的版本并相应地更新 package-lock.json。
我希望这能澄清一切
感谢您阅读并提出这个问题。