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
来避免。
yarn --frozen-lockfile
# 或
npm ci
上面两个命令的作用类似,必须存在lockfile且依赖版本和package.json匹配时才会安装依赖,否则报错。如此可强制开发者在持续集成前先在本地解决依赖版本的一致性问题。
4、使用yarn/npm自带的机制解决代码合并时的lockfile冲突
yarn@1.0.0和npm@5.7.0之后的版本都提供了自动解决lockfile冲突的方式,可在合并冲突出现后执行install命令:
yarn
或
npm install
5、[建议]使用yarn。
npm和yarn一直都在互相学习,现在除了CLI命令有一定不同之外,其他特性都已经十分相似,npm安装依赖的速度也和yarn的差距越来越小。
但如上所述,npm早期几个版本之间的lockfile策略有差异,可能会因为不同环境下的npm版本不同而导致依赖不一致。yarn则没有这个担忧。