Yarn依赖安装问题:二级依赖未按yarn.lock指定版本安装
--pure-lockfile时二级依赖自动安装最新版的问题 我之前踩过完全一样的坑!这其实是Yarn处理Git仓库依赖时的默认行为导致的——当你通过yarn add git+ssh://<user>@<host>:<repo>安装包A时,Yarn默认不会读取A自身的yarn.lock文件,而是会根据A的package.json重新解析所有二级依赖(比如B)。哪怕A的yarn.lock里锁定了B的特定版本,Yarn也会忽略它,直接拉取符合package.json规则的最新版B。
下面是几个亲测有效的解决方案,你可以根据自己的场景选择:
方案一:修改包A的package.json(最规范的做法)
既然A已经和特定版本的B完成了测试,那直接在A的package.json里把B的版本明确写死,比如:
"dependencies": { "B": "1.2.3" // 这里写A的yarn.lock里锁定的那个版本号 }
这样不管Yarn怎么解析依赖,都会安装指定的版本,彻底避免版本漂移的问题。如果没办法直接修改A的代码,可以在公司GitLab上提交一个MR,把版本锁加上,这对所有使用A的项目都有好处。
方案二:用resolutions强制锁定版本(无需修改A的代码)
如果你暂时没办法修改A的package.json,可以在你的项目的package.json里添加resolutions字段,强制指定B的版本:
"resolutions": { "B": "1.2.3" // 替换成A的yarn.lock里的版本号 }
这个字段是Yarn的专属特性,它会强制让整个项目树里所有地方的B都使用你指定的版本,不管依赖链是怎么引入的。设置好之后,再运行yarn --pure-lockfile,B就会安装正确的版本了。
方案三:升级到Yarn Berry(Yarn 2+)并配置读取Git依赖的lockfile
如果你们团队正在考虑升级Yarn版本,Yarn Berry对Git依赖的lockfile支持更完善。你可以在项目的.yarnrc.yml里添加如下配置:
gitDependenciesMeta: "A": # 替换成你的依赖包A的名称 yarnLock: true
这个配置会告诉Yarn,在安装包A的时候,读取它仓库里的yarn.lock文件,从而自动安装A测试过的B版本。
额外提醒
- Yarn忽略Git依赖的lockfile是有原因的:它默认认为Git仓库里的代码是未发布的开发版本,lockfile可能不是最终稳定版。但对于你们公司内部已经测试完成的包,这个默认行为反而会带来问题。
- 使用
resolutions的时候,要确保你指定的版本确实是A兼容的那个版本,不然可能会引入新的兼容性问题。
内容的提问来源于stack exchange,提问作者user4344

