从带内部依赖的Yarn Workspace Monorepo构建NPM包遇依赖缺失问题
Yarn Workspace发布NPM库依赖私有包找不到的解决办法
问题根源
你把私有核心包jakelo123-core设成了库的devDependency,但NPM发布包时,devDependencies不会被自动安装到使用该库的应用里,而你的库编译后代码还在引用这个包,自然就会出现模块找不到的错误。
可行解决方案
方案1:把核心包移到dependencies并发布
- 编辑库的
package.json,把jakelo123-core从devDependencies移到dependencies字段里 - 把
jakelo123-core也发布到NPM(如果是私有包,得用私有NPM源,比如公司内部仓库或者Verdaccio) - 重新发布
jakelo123-user-lib,这样应用安装时会自动拉取这个核心依赖
方案2:打包时把核心包代码打进库产物里
如果jakelo123-core不需要单独发布,直接把它的代码打包进你的库:
- 用Webpack的话,配置
resolve.alias指向核心包的源码,同时添加对应的编译规则,确保打包时把核心包代码包含进去 - 用Rollup的话,用
@rollup/plugin-node-resolve插件,设置resolveOnly包含工作区包,或者直接把核心包作为依赖打包进产物 - 构建完去
dist目录检查,确认核心包的代码已经在里面了
方案3:用Yarn的workspace:协议(仅限本地开发)
如果只是本地工作区开发用,可以在库的package.json里这么写依赖:
"dependencies": { "jakelo123-core": "workspace:*" }
但注意,这种写法发布到NPM后,外部应用识别不了workspace:协议,所以要发布的话必须换成实际的版本号。
额外要检查的点
- 确认
jakelo123-core的package.json里,main或者module字段指向的是正确的入口文件,不然你的库就算找到了包也引用不对 - 构建库的时候,别把
jakelo123-core设成外部依赖(比如Webpack的externals不要加这个包),不然打包时会跳过它
内容的提问来源于stack exchange,提问作者Jake Loew
相关产品推荐
相关产品推荐

