NPM5,package-lock.json和package.json有什么区别?



将NPM更新到版本5后,我找到了package-lock.json带有package.json的文件。

这两个文件有什么区别?

package-lock.json的优势是什么?

package.json 文件:列出项目所依赖的包。 允许您使用语义版本控制规则指定项目可以使用的包的版本。

根据 npm 文档,

对于 npm 修改node_modules树或 package.json 的任何操作,都会自动生成 package-lock.json 。它描述了生成的确切树,以便后续安装能够生成相同的树,而不考虑中间依赖项更新。

此文件旨在提交到源存储库中,并具有多种用途:

  • 描述依赖关系树的单个表示形式,以便保证团队成员、部署和持续集成安装完全相同的依赖关系。

  • 为用户提供一种工具,使其可以"时间旅行"到以前的node_modules状态,而无需提交目录本身。

  • 通过可读的源代码管理差异提高树更改的可见性。

基本上,package-lock.json 用于通过允许 npm 跳过以前安装的软件包的重复元数据解析来优化安装过程。

在 npm 5.x.x 之前,package.json 是一个项目的真实来源。生活在package.json中的东西是法律。npm 用户喜欢这个模型,并且非常习惯于维护他们的包文件。然而,当包锁首次被引入时,它的行为与许多人的预期相反。给定预先存在的包和包锁,对 package.json(许多用户认为是事实来源)的更改不会反映在包锁中。

示例:包 A,版本 1.0.0 在包和包锁定中。在 package.json 中,A 被手动编辑到版本 1.1.0。如果用户认为 package.json 是事实来源 运行npm install,他们希望安装版本 1.1.0。但是,尽管列出了 v1.1.0 是 package.json,但安装了版本 1.0.0。

示例:模块不存在于包锁中,但它确实存在于包.json中。作为将 package.json 视为事实来源的用户,我希望安装我的模块。但是,由于该模块不存在在包锁定中,因此未安装它,并且我的代码失败,因为它找不到该模块。

在官方 npm 文档中阅读更多关于 package-lock.json 的信息!

package.json仅记录您的直接依赖项及其版本。

package-lock.json不仅记录您的直接依赖项和确切版本,还记录依赖项的所有依赖项 - 整个依赖项树,换句话说,具有确切版本。


事实上,package-lock.json记录了项目的所有依赖项(包括子依赖项)的确切版本,以确保每次生成都是相同的。(这就是为什么npm ci基于package-lock.json而不是package.json构建。

基于package.json

的构建(与npm i一样)不能保证每个构建的所有子依赖项都是完全相同的版本(例如,如果其中一个依赖项的子依赖项发布了更新,但直接依赖项的版本没有更改),即使在package.json中指定了直接依赖项的确切版本号。

最新更新