在将NPM更新到版本5后,我发现package-lock.json
文件与package.json一同出现。
这两个文件之间有什么区别?
package-lock.json
的优点是什么?
在将NPM更新到版本5后,我发现package-lock.json
文件与package.json一同出现。
这两个文件之间有什么区别?
package-lock.json
的优点是什么?
一个 package.json 文件:列出了您的项目依赖的包,并允许您使用语义化版本控制规则指定您的项目可以使用的包的版本。
根据 npm 文档,
package-lock.json 在任何操作修改 node_modules 树或 package.json 的情况下会自动生成。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖关系的更新。
此文件旨在提交到源代码库中,并具有各种目的:
描述一棵依赖树的单个表示,以便团队成员、部署和持续集成保证安装完全相同的依赖项。
为用户提供“时光旅行”到以前的 node_modules 状态的工具,无需提交目录本身。
通过可读的源代码控制差异,促进对树更改的更大可见性。
基本上,package-lock.json 用于优化安装过程,允许 npm 跳过先前安装的软件包的重复元数据解析。
在 npm 5.x.x 之前,package.json 是项目的真相来源。package.json 中的内容是法律规定。npm 用户喜欢这个模型并习惯了维护其包文件。然而,当 package-lock 第一次引入时,它与许多用户的预期相反。给定一个现有软件包和 package-lock,package.json(许多用户认为这是真相来源)的更改没有反映在 package-lock 中。
例如:软件包 A,版本 1.0.0 在包和 package-lock 中。在 package.json 中,手动将 A 编辑为版本 1.1.0。如果一个认为 package.json 是真相来源的用户运行 npm install
,他们会期望安装版本 1.1.0。然而,安装的是版本 1.0.0,尽管 v1.1.0 在 package.json 中列出。
示例:在 package-lock 中不存在一个模块,但是在 package.json 中存在。作为一个将 package.json 视为真相来源的用户,我希望我的模块能够被安装。然而,由于该模块未出现在 package-lock 中,它没有被安装,我的代码因为找不到该模块而失败。
在官方 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
中指定了 直接依赖项 的版本。