如何处理Bun.js单仓中依赖包发布时的依赖配置问题?
解决方案
核心问题很明确:NPM无法识别workspace:*这个依赖协议,外部用户安装时会找不到对应的包,所以发布前必须把依赖声明里的workspace:*替换为对应包的实际NPM版本号。
下面是几种可行的处理方式:
1. 写自动化脚本处理(最直接)
你可以在包的package.json里添加prepublishOnly钩子脚本,发布前自动替换workspace:*为正确的版本号。
比如给@stylecss/cli的package.json添加脚本:
"scripts": { "prepublishOnly": "bun run ./scripts/replace-workspace-deps.js", "postpublish": "git checkout package.json" }
然后写一个简单的Bun脚本replace-workspace-deps.js:
import { readFile, writeFile } from 'fs/promises'; import cliPkg from '../package.json' assert { type: 'json' }; import compilerPkg from '../../compiler/package.json' assert { type: 'json' }; // 将依赖的workspace:*替换为compiler包的实际版本 cliPkg.dependencies['@stylecss/compiler'] = compilerPkg.version; await writeFile('../package.json', JSON.stringify(cliPkg, null, 2));
postpublish脚本用git还原package.json,避免本地工作区的依赖声明被修改。
2. 使用Monorepo发布工具(更省心)
如果你的仓库包数量较多,推荐用专门的多包发布工具,这类工具可以自动帮你:
- 管理各包的版本号
- 替换
workspace:*为对应版本 - 生成CHANGELOG
- 批量发布包
这类工具能减少手动脚本的维护成本,适合长期维护的monorepo项目。
关于自动回退的问题
没有办法让包在工作区不可用时自动回退到NPM仓库,因为NPM安装时只会严格按照package.json里的依赖声明去查找,workspace:*在非工作区环境下完全无效,必须替换成有效的版本号才能让外部用户正常安装使用。
内容的提问来源于stack exchange,提问作者user21392777
相关产品推荐
相关产品推荐

