概述
与传统的依赖管理方式中每个工作区包需要独立指定版本不同,目录让你能够:- 在根目录的 package.json 中定义版本目录
- 使用简洁的
catalog:协议引用这些版本 - 仅需修改一个地方即可同时更新所有包
如何使用目录
目录结构示例
假设有如下结构的 monorepo:1. 在根目录 package.json 中定义目录
在根目录的package.json 中,在 workspaces 对象内添加 catalog 或 catalogs 字段:
package.json
catalog 或 catalogs 放在 package.json 的顶层,也同样有效。
2. 在工作区包中引用目录版本
在工作区包中,使用catalog: 协议引用版本:
packages/app/package.json
packages/ui/package.json
3. 运行 Bun Install
运行bun install,即可根据目录中定义的版本安装所有依赖。
Catalog 与 Catalogs 的区别
Bun 支持两种定义目录的方式:-
catalog(单数):用于常用依赖的单一默认目录使用时仅需写package.jsoncatalog::packages/app/package.json -
catalogs(复数):用于分组依赖的多个命名目录使用时需要指定目录名,格式为package.jsoncatalog:<name>:packages/app/package.json
使用目录的好处
- 一致性:确保所有包使用相同版本的关键依赖
- 维护方便:只需在一个地方更新依赖版本,而非多个 package.json
- 清晰明了:明确表示哪些依赖在整个 monorepo 中统一使用
- 简单易用:无需复杂的版本解析策略或外部工具
真实示例
以下是一个针对 React 应用的更完整示例: 根目录 package.jsonpackage.json
packages/app/package.json
packages/ui/package.json
packages/utils/package.json
更新版本
要更新所有包的版本,只需修改根目录 package.json 中的版本:package.json
bun install 即可更新所有包。
锁文件集成
Bun 的锁文件会跟踪目录版本,确保不同环境中的安装一致。锁文件包含:- package.json 中的目录定义
- 每个目录依赖的解析结果
bun.lock(excerpt)
限制与注意事项
- 目录引用必须匹配
catalog或某个命名catalogs中定义的依赖 - 目录名称中的空字符串和空白字符会被忽略(视为默认目录)
- 目录中的无效依赖版本会导致
bun install解析失败 - 目录仅在工作区内有效,无法在 monorepo 外使用
发布
当你运行bun publish 或 bun pm pack 时,Bun 会自动将 package.json 中的 catalog: 引用替换为具体的版本号。发布的包中包含标准的 semver 版本字符串,不再依赖你的目录定义。