使用Yarn Workspaces的Monorepo中已发布包依赖未发布本地包报错
解决Monorepo中已发布包依赖未发布内部包的安装报错问题
问题根源
你用Yarn Workspaces开发的monorepo里,jake-react-lib的package.json中依赖的jake-core仍然是包名形式(比如"jake-core": "*"),Yarn Workspaces仅在本地开发时会解析为本地工作区的包,但发布到NPM后,外部项目安装时会默认去NPM registry查找jake-core,而该包未发布,因此触发404错误。yarn workspaces info显示的workspaceDependency只是本地工作区的依赖关系标识,不会自动修改发布后的依赖指向。
可行解决方案
1. 将内部依赖打包进发布产物
如果jake-core是jake-react-lib的私有工具库,推荐把它的代码直接打包进jake-react-lib的最终发布文件中:
- 用Rollup、Webpack等打包工具构建
jake-react-lib时,配置工具将jake-core视为内部依赖,不排除在打包范围外。 - 以Rollup为例,修改配置文件,确保
external数组中不包含jake-core,同时用@rollup/plugin-node-resolve插件解析monorepo内的模块路径,最终构建出包含jake-core代码的单文件或多文件产物。 - 发布前确认打包后的产物中已经包含
jake-core的逻辑,这样外部项目安装后无需额外依赖jake-core。
2. 修改依赖指向为GitHub仓库
如果不想打包内部依赖,可以直接修改jake-react-lib的package.json,把jake-core的依赖从包名改为指向你的GitHub仓库路径:
- 将依赖项从
"jake-core": "*"改为"jake-core": "github:JakeLo123/test-monorepo/packages/jake-core" - 这样外部项目安装时,会直接从GitHub拉取
jake-core的代码,无需依赖NPM registry。 - 注意:确保GitHub仓库是公开的,或者安装
jake-react-lib的外部项目有该仓库的访问权限。
3. 结合Yarn Berry的工作区协议(Yarn 2+)
如果使用Yarn Berry(Yarn 2及以上版本),可以利用workspace:协议优化依赖管理:
- 在
jake-react-lib的package.json中写"jake-core": "workspace:^" - 发布前配置
publishConfig,让Yarn在发布时自动替换依赖指向:"publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" } - 但由于
jake-core不发布到NPM,最终还是需要结合第二种方案,将workspace:协议替换为GitHub仓库地址,或者在发布脚本中自动修改依赖项。
内容的提问来源于stack exchange,提问作者Jake Loew
相关产品推荐
相关产品推荐

