概述
与传统的依赖管理不同,传统方式中每个工作空间包都需要独立指定版本,目录让你可以:- 在根 [package.json] 中定义版本目录
- 使用简单的
catalog:协议引用这些版本 - 通过仅更改一个地方的版本来同时更新所有包
如何使用目录
目录结构示例
考虑一个具有以下结构的单一代码库:1. 在根 package.json 中定义目录
在你的根级 [package.json] 中,在 [workspaces] 对象中添加一个 [catalog] 或 [catalogs] 字段:package.json
2. 在工作空间包中引用目录版本
在你的工作空间包中,使用catalog: 协议来引用版本:
packages/app/package.json
packages/ui/package.json
3. 运行 Bun Install
运行bun install 根据目录版本安装所有依赖。
Catalog vs Catalogs
Bun 支持两种定义目录的方式:-
catalog(单数): 用于常用依赖的单个默认目录简单地使用package.jsoncatalog:引用:packages/app/package.json -
catalogs(复数): 多个命名目录用于分组依赖使用package.jsoncatalog:<name>引用:packages/app/package.json
使用目录的好处
- 一致性: 确保所有包使用关键依赖的相同版本
- 维护性: 在一个地方更新依赖版本,而不是跨多个 [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(excerpt)
限制和边缘情况
- 目录引用必须匹配在 [catalog] 或命名 [catalogs] 中定义的依赖
- 目录名称中的空字符串和空白字符被忽略(视为默认目录)
- 目录中无效的依赖版本将在
bun install期间解析失败 - 目录仅在工作空间内可用;不能在单一代码库外使用
发布
当你运行bun publish 或 bun pm pack 时,Bun 会自动将你的 [package.json] 中的 catalog: 引用替换为解析后的版本号。发布的包包含常规的语义化版本字符串,不再依赖你的目录定义。