跨工作区使用Lerna publish报错“未找到匹配版本”如何解决?
解决Lerna工作区发布时依赖包版本找不到的问题
我之前也踩过这个坑!问题出在你用了**带语义化版本范围的依赖声明(比如^1.0.0-alpha.9)**来引用工作区内的core包,导致Lerna发布流程卡壳。
为什么会失败?
Lerna的发布逻辑是先把所有包的版本号更新到alpha.10,然后尝试发布这些包。但client的依赖写的是^1.0.0-alpha.10,npm会先去远程仓库找这个版本的core——可这个版本还没被发布上去呢,自然会报ETARGET错误。
正确的工作区依赖引用方式
有两种靠谱的解决办法,选一种就行:
1. 使用npm工作区协议(推荐,npm 7+支持)
把client的package.json里的core依赖改成工作区协议声明:
{ "name": "client", "version": "1.0.0-alpha.9", "dependencies": { "core": "workspace:^1.0.0-alpha.9" // 或者更灵活的写法:"core": "workspace:*",自动关联同工作区的版本 }, }
这个协议会明确告诉npm:优先使用本地工作区里的core包,不要去远程仓库找。Lerna发布时也能正确识别这种依赖关系,先发布core再发布client,不会出现版本找不到的问题。
2. 使用精确版本号(不带范围前缀)
去掉依赖版本前的^,改成精确版本:
{ "name": "client", "version": "1.0.0-alpha.9", "dependencies": { "core": "1.0.0-alpha.9" }, }
Lerna更新版本时,会把client里的core依赖版本也同步改成1.0.0-alpha.10,发布时npm会严格等待core发布完成后,再用精确版本安装它,不会去拉取不存在的范围版本。
修复当前失败的状态
现在你的项目已经被Lerna更新了版本号但发布失败,需要先回滚:
- 手动把所有
package.json里的版本改回1.0.0-alpha.9,或者执行lerna version revert(如果你的Lerna版本支持的话) - 按照上面的方法修改
client对core的依赖声明 - 重新执行
npx lerna publish --no-private
补充说明
你提到手动执行npm i core -w client能正常安装,是因为这个命令明确指定了从工作区安装包,npm会直接链接本地版本;但普通的npm i会严格按照package.json里的版本范围去远程仓库查找,所以才会报错。
内容的提问来源于stack exchange,提问作者Joe Jankowiak
相关产品推荐
相关产品推荐

