浅谈 npm package-lock.json-package文件

浅谈 npm package-lock.json-package文件

package.json 已经深入人心了,今天想谈谈 package-lock.json。

缘起

将npm版本升级到5.0以后,会出现一种新的自动生成文件【package-lock.json】。它的内容非常繁琐,简直不是给人看的。其实,它也真没打算给一般人看~~~ 它是给npm安装时看的,告知系统详细的包依赖情况。为什么要这么麻烦?

package.json 描述了项目中每个第三方库的版本号,这很好,可是这有一个大BUG。

因为库的依赖可能会有好几层的深度。比如,A(V1.0)库依赖于 A1(V1.0),A1又依赖于A2(V1.0),A2又依赖于A3(V1.0)。

张三根据package.json安装了,项目运行,正常!

三天后,李四安装了同样的项目,项目运行,失败!!!

为何?原来这3天中A3的作者很勤快地更新到了(V1.1),所以李四安装时安装的是A3(V1.1),而其中有一个不兼容的问题影响到项目的正常运行。

package-lock.json 描述了你项目中所有依赖库的版本号,所有!所以能避免上面这个问题,所以你明白文件名中 lock 的意思了吧?

现在,npm会根据 package-lock.json 里的内容来处理和安装依赖而不是根据 package.json。因为 pacakge-lock.json 给每个依赖标明了版本,获取地址和哈希值,使得每次安装都会出现相同的结果。不管你在什么机器上面或什么时候安装。

传奇历史

世界是否就从此一片宁静了?骚年,图样图森破。混乱从现在才刚刚开始。

从此开始了 package.json 与 package-lock.json 相爱相杀的传奇历程:

  • npm 5.0.x 版本,无视package.json的手动修改,npm install 时都会根据 package-lock.json 来安装依赖库
  • npm 5.1.0 版本后 npm install 会无视 package-lock.json 文件,去下载最新的 npm
  • npm 5.4.2 版本后 如果手动修改 package.json,导致它和 package-lock.json 不一致,npm install 时会根据 package.json 中的版本号以及语义含义去下载最新的包,并更新至 package-lock.json

这段时间中,网络上存在大量的争议和控诉,至此终于混乱告一段落了。

现在,我机器上npm的版本是5.6.0,我已经能很愉快地面对 package-lock.json 了。

所以,你不妨也检查一下你机器上的 npm 版本,以避免各种历史上的奇葩问题。

合并冲突

分支合并中,如果发现冲突怎么办?

在merge conflicts的阶段,只需要从主分支中checkout去package-lock.json,再以此为基础,重新安装新分支中需要的依赖。

敲黑板划重点

  1. 尽量让工具自己来管理 package-lock.json,避免手工修改该文件
  2. package-lock.json 应提交进 git 库,以确保团队中所有人能在统一的依赖标准中愉快地玩耍
  3. 使npm版本较新(大于等于5.4.2)

推荐阅读