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

Sat*_*ani 2 dependency-management npm package.json package-lock.json

在将NPM更新到版本5之后,我找到了package-lock.json包含package.json的文件.

这两个文件有什么区别?

有什么好处package-lock.json

Mad*_*ted 9

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

根据npm文档,

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

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

  • 描述依赖关系树的单个表示,以确保队友,部署和持续集成能够安装完全相同的依赖关系.

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

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

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

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

示例:包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视为事实来源的用户,我希望能够安装我的模块.但是,由于程序包锁中不存在该模块,因此未安装该模块,并且我的代码因无法找到模块而失败.

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