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,再以此为基础,重新安装新分支中需要的依赖。
敲黑板划重点
- 尽量让工具自己来管理 package-lock.json,避免手工修改该文件
- package-lock.json 应提交进 git 库,以确保团队中所有人能在统一的依赖标准中愉快地玩耍
- 使npm版本较新(大于等于5.4.2)