Skip to main content
Catalogs(目录) 在单体仓库中的包之间共享依赖版本。无需在每个工作空间包中重复相同的版本,你可以在根 package.json 中统一定义它们,并在整个项目中引用。

概述

不再让每个工作空间包指定自己的版本,而是:
  1. 在根 package.json 中定义版本目录
  2. 使用 catalog: 协议引用这些版本
  3. 通过在一处更改版本即可同时更新所有包
这在大型单体仓库中尤为重要,因为数十个包依赖于相同版本的關鍵依赖。

如何使用 Catalogs

目录结构示例

考虑以下结构的单体仓库:

1. 在根 package.json 中定义 Catalogs

在你的根级 package.json 中,在 workspaces 对象内添加 catalogcatalogs 字段:
package.json
catalogcatalogs 也可以在 package.json 的顶层使用。

2. 在工作空间包中引用目录版本

在你的工作空间包中,使用 catalog: 协议来引用版本:
packages/app/package.json
packages/ui/package.json

3. 运行 Bun Install

运行 bun install 以根据目录版本安装所有依赖。

Catalog 与 Catalogs

Bun 支持两种定义目录的方式:
  1. catalog(单数):用于常用依赖的单个默认目录
    package.json
    使用 catalog: 引用:
    packages/app/package.json
  2. catalogs(复数):用于对依赖进行分组的多个命名目录
    package.json
    使用 catalog:<name> 引用:
    packages/app/package.json

使用 Catalogs 的好处

  • 一致性:所有包使用相同版本的关键依赖
  • 维护性:在一处更新依赖版本,而不是在多个 package.json 文件中
  • 清晰性:一目了然地了解哪些依赖在你的单体仓库中是标准化的
  • 简洁性:无需额外的版本解析策略或外部工具

实际示例

一个更大的示例,用于 React 应用: 根 package.json
package.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 publishbun pm pack 时,Bun 会将 package.json 中的 catalog: 引用替换为已解析的版本号。发布的包包含常规的 semver 字符串,不再依赖于你的目录定义。