Yarn 的 lockfile 是怎么保证依赖版本一致的?
1. 用 yarn.lock 记录完整依赖树
- Yarn 在项目中维护一个名为 yarn.lock 的文件,记录依赖树中每一个包的确切版本、解析地址和完整性校验值
- 该文件由 Yarn 自动生成和维护,开发者不应手动编辑;执行 yarn add、yarn remove、yarn upgrade 等操作时,它会随之更新
- 安装时 Yarn 只读取项目顶层的 yarn.lock,忽略各依赖内部可能存在的同名文件,因为顶层文件已包含整棵依赖树所需的全部信息
2. 通过三重机制保证确定性安装
- 版本锁定:每个依赖都被锁定到确切版本号,消除 semver 范围(如 ^1.2.0)的歧义
- 地址固化:存储完整的 tarball 下载地址,避免注册表解析漂移
- 完整性校验:每个包条目都带有 SHA-512 校验哈希,下载后逐字节比对,确保内容未被篡改或损坏
3. 跨机器复现同一结果
- 只要使用相同版本的 Yarn 并配合同一份 yarn.lock,不同机器上会得到完全一致的依赖树
- yarn.lock 应纳入版本控制(如 Git),使团队成员、CI 服务器都能安装出相同的依赖
- 需要注意的是,lockfile 只保证"解析结果一致",具体的 node_modules 目录布局还依赖 Yarn 自身的提升算法,因此不同 Yarn 版本之间可能出现目录结构差异