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

Posted

技术标签:

【中文标题】NPM5,package-lock.json 和 package.json 有啥区别?【英文标题】:NPM5, What is the difference of package-lock.json with package.json?NPM5,package-lock.json 和 package.json 有什么区别? 【发布时间】:2018-07-05 11:46:51 【问题描述】:

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

这两个文件有什么区别?

package-lock.json有什么优势?

【问题讨论】:

【参考方案1】:

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

根据 npm 文档,

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

此文件旨在提交到源存储库,并用于各种用途:

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

为用户提供“时间旅行”到 node_modules 先前状态的工具,而无需提交目录本身。

通过可读的源代码控制差异来促进对树更改的更大可见性。

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

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

示例:包 A,版本 1.0.0 在包和包锁中。在 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 中,因此它没有安装,并且我的代码因为找不到该模块而失败。

在Official npm Documentation! 中阅读有关 package-lock.json 的更多信息!

【讨论】:

这是迄今为止最简单的解释,但没有投票! @Debadatta 那是因为问题已经回答了here 那为什么还要让 package.json 跟踪依赖关系呢?

以上是关于NPM5,package-lock.json 和 package.json 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

npm5 package-lock.json 不同机器上的不同条目

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

NodeJs开发之三: package.json和Package_lock.json

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

安装npm install vue的时候会生成package-lock.json怎么解决

20180504