不同Yarn版本是否会导致yarn install修改yarn.lock文件?
解答
同属Yarn 1(Classic)系列的不同补丁版本,确实可能在未修改package.json的前提下触发yarn.lock变更,你遇到的1.22.18与1.22.19版本差导致的改动属于明确的版本行为差异,不是配置错误。
原因说明
- 你之前使用1.22.18安装1.22.17生成的lock文件无变更,是因为这两个版本之间没有调整lock文件的解析、序列化规则,依赖元数据的生成逻辑完全一致。
- 1.22.19是Yarn 1系列的安全修复更新,这个版本上线了几处直接影响lock文件生成的逻辑调整,即便
package.json完全不变,执行install时也会重写lock文件的对应元数据:- 修复了部分场景下依赖
integrity完整性校验值计算错误、字段缺失的问题,会自动修正错误哈希、补全漏写的校验值 - 统一了跨平台的lock文件序列化规则,修正了之前Windows/macOS/Linux下依赖条目排序、换行符生成不一致的问题
- 补全了部分可选依赖、平台专属依赖的标记字段,会给对应依赖自动补上
optional、os、cpu类属性标记
- 修复了部分场景下依赖
- 上述改动都不会变更实际安装的依赖版本,仅调整lock文件存储的元数据,因此install过程不会修改
package.json,最终安装到本地的包内容也和lock文件之前锁定的版本完全一致。
处理方案
- 先对比本地变更后的
yarn.lock与仓库版本的差异:如果改动仅涉及字段补全、条目排序、校验值修正,没有出现依赖版本号变化,就属于版本差导致的正常改动,直接提交更新后的lock文件即可。 - 从根源解决问题需要统一全团队开发环境、CI流水线的Yarn版本:
- 可以在项目
package.json中通过packageManager字段固定版本为yarn@1.22.19,所有协作者安装对应版本即可 - 本地直接执行
npm install -g yarn@1.22.19升级到对应版本,后续执行install就不会再产生无意义的lock文件改动
- 可以在项目
- 额外注意:不要跨Yarn大版本混用(比如用Yarn 1安装Yarn 2+/Berry生成的lock文件),跨大版本的lock格式差异极大,会直接导致依赖解析错乱。
如果对比后发现lock文件改动涉及实际依赖版本升级,和小版本行为差异无关,可以先执行
yarn cache clean清空本地缓存,确认当前使用的npm registry源和团队统一源一致后,重新执行install即可。
内容的提问来源于stack exchange,提问作者Tony Lucas
相关产品推荐
相关产品推荐

