Lockfile的作用

1、确保每次install时生成稳定的依赖树,锁定依赖和依赖的依赖的版本。
2、提升install的速度。yarn和npm都有一些诸如适配和提取公共依赖版本、扁平化依赖的优化策略,lockfile的存在可节省计算时间。

package-lock.json和yarn.lock

yarn.lock

生成和更新策略如下:

  • 若yarn.lock不存在,安装依赖并生成yarn.lock。
  • 若yarn.lock存在且与package.json中的版本范围匹配,yarn.lock保持不变,yarn不会检查是否有新版本。
  • 若yarn.lock不满足package.json中的所有依赖项,yarn将查找最新的满足package.json中约束的可用版本,并更新yarn.lock。

package-lock.json

npm从5.0版本之后默认增加lockfile,但是早期不同版本对lockfile的实现有过变更:
1、5.0.x版本,不管package.json怎么变,install时都会根据lock文件下载。
2、5.1.0版本后,npm install会无视lock文件,去下载最新的npm包。
3、5.4.2版本后,表现和yarn.lock一致。

Lockfile的正确使用姿势


1、提交每一次的lockfile更新


例如yarn add 一个新的依赖后,将package.json和yarn.lock的变化同时提交。

2、不要混用包管理工具


例如项目的包管理工具是yarn,lockfile为yarn.lock。此时若执行npm install [some-dependency],会更新package.json和新建一个package-lock.json,不会更新yarn.lock。

3、—frozen-lockfile的使用


即使有lockfile的存在,也无法保证在持续集成环境中每次安装依赖都和开发时一致,因为可能存在package.json和lockfile版本号不匹配并需要更新依赖版本的情况。可以使用—frozen-lockfile来避免。

  1. yarn --frozen-lockfile
  2. npm ci


上面两个命令的作用类似,必须存在lockfile且依赖版本和package.json匹配时才会安装依赖,否则报错。如此可强制开发者在持续集成前先在本地解决依赖版本的一致性问题。

4、使用yarn/npm自带的机制解决代码合并时的lockfile冲突


yarn@1.0.0和npm@5.7.0之后的版本都提供了自动解决lockfile冲突的方式,可在合并冲突出现后执行install命令:

  1. yarn
  2. npm install

参考:https://zhuanlan.zhihu.com/p/260094037