package.json 中定义一次,然后在整个项目中引用即可。
概述
无需让每个工作区软件包单独指定自己的版本,你可以:- 在根目录的
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
catalog: 引用可在 dependencies、devDependencies、optionalDependencies、peerDependencies 中使用,也可作为根目录 overrides 规则的值使用。目录引用的行为与直接内联目录范围完全相同。
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 add 添加到目录
bun add --catalog(或 --catalog=<name>)会将条目添加到根目录,并将 "catalog:" 写入当前软件包。如果未传入显式版本,则会重复使用现有的目录条目。请参阅 bun add --catalog。
即使不使用该标志,bun add react(不带版本)也会在默认目录已列出 react 时写入 "catalog:"。传入版本则会改为写入具体的范围。
锁文件集成
Bun 的锁文件会跟踪目录版本,因此可以确保不同环境中的安装结果一致。锁文件包含:- package.json 中的目录定义
- 每个目录依赖的解析结果
bun.lock(excerpt)
限制与注意事项
- 目录引用必须匹配
catalog或命名目录之一中定义的依赖项 - 目录名称中的空字符串和空格会被忽略(视为默认目录)
catalog:default与catalog:相同。默认目录可以定义为catalog或catalogs.default,但同一个软件包同时列在两者中会导致错误- 目录中的无效依赖版本在
bun install期间无法解析 catalog:仅适用于根目录和工作区的package.json文件。在已发布的软件包中无法解析——使用bun publish或bun pm pack发布时,它们会将其替换为实际范围(请参阅发布)
发布
当你运行bun publish 或 bun pm pack 时,Bun 会将 package.json 中的 catalog: 引用替换为解析后的版本号。发布的包包含常规的 semver 字符串,不再依赖你的 catalog 定义。