npm和yarn的lockfile杂谈

2,996 阅读2分钟

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的变化同时提交,避免下一个开发者install时懵逼地发现lockfile发生更新。

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.0npm@5.7.0之后的版本都提供了自动解决lockfile冲突的方式,可在合并冲突出现后执行install命令,而避免手动解决lockfile的冲突。

yarn
或
npm install

5、[建议]使用yarn。

npm和yarn一直都在互相学习,现在除了CLI命令有一定不同之外,其他特性都已经十分相似,npm安装依赖的速度也和yarn的差距越来越小。

但如上所述,npm早期几个版本之间的lockfile策略有差异,可能会因为不同环境下的npm版本不同而导致依赖不一致。yarn则没有这个担忧。