package.json 中统一定义它们,并在整个项目中引用。
概述
不再让每个工作空间包指定自己的版本,而是:- 在根
package.json中定义版本目录 - 使用
catalog:协议引用这些版本 - 通过在一处更改版本即可同时更新所有包
如何使用 Catalogs
目录结构示例
考虑以下结构的单体仓库:1. 在根 package.json 中定义 Catalogs
在你的根级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
使用 Catalogs 的好处
- 一致性:所有包使用相同版本的关键依赖
- 维护性:在一处更新依赖版本,而不是在多个
package.json文件中 - 清晰性:一目了然地了解哪些依赖在你的单体仓库中是标准化的
- 简洁性:无需额外的版本解析策略或外部工具
实际示例
一个更大的示例,用于 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(摘录)
限制和边界情况
- 目录引用必须匹配在
catalog或某个命名catalogs中定义的依赖 - 目录名称中的空字符串和空格会被忽略(视为默认目录处理)
- 目录中的无效依赖版本会在
bun install时解析失败 - 目录仅在工作空间内可用;不能在单体仓库之外使用
发布
当你运行bun publish 或 bun pm pack 时,Bun 会将 package.json 中的 catalog: 引用替换为已解析的版本号。发布的包包含常规的 semver 字符串,不再依赖于你的目录定义。