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

时间:2018-01-26 05:31:11

标签: npm dependency-management package.json package-lock.json

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

这两个文件有什么区别?

package-lock.json有什么好处?

1 个答案:

答案 0 :(得分:9)

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-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视为事实来源的用户,我希望能够安装我的模块。但是由于软件包没有出现在软件包锁中,所以它没有安装,我的代码因为无法找到模块而失败。

Official npm Documentation中了解有关package-lock.json的更多信息!