catalog(目录协议)
目录是工作区功能,用于将依赖版本范围定义为可重用常量,目录中定义的常量可以在
package.json
中使用,
结合pnpm-workspace.yaml
使用
- 定义
pnpm-workspace.yaml
packages:定义多仓库
packages:- 'packages/*'catalog:chalk: ^4.1.2catalogs:react16:react: ^16.7.0react-dom: ^16.7.0react17:react: ^17.10.0react-dom: ^17.10.0
这里有两种方式定义 catalog
- catalog
普通定义,一一对应,默认值为
default
// pnpm-workspace.yaml
catalog:chalk: ^4.1.2
// packages/app/package.json
{"name": "app","dependencies": {"chalk": "catalog:"}
}
- catalogs
具名,将多个
catalog
整合成一个catalogs
// pnpm-workspace.yaml
catalogs:react16:react: ^16.7.0react-dom: ^16.7.0react17:react: ^17.10.0react-dom: ^17.10.0
// packages/app/package.json
{"name": "app","dependencies": {"react": "catalog:react18","react-dom": "catalog:react18"}
}
优点
monorepo或多包存储库中,许多包是有相同依赖的。目录减少了
package.json
文件时的重复,并提供以下好处
- 维护唯一版本
工作区中最好只有一个版本的依赖项。目录使维护更容易。重复的依赖项可能会在运行时发生冲突并导致错误。
- 升级简单
升级依赖时,只需要编辑目录,而不用修改各个包中的
package.json
- 更少的合并冲突
由于依赖项变动不需要编辑
package.json
,这类文件导致的冲突将最小化
运行与发布
在运行时,
catalog
协议会被删除,发布时会被替换成对应版本
注意事项
使用
pnpm update
并不能更新pnpm-workspace.yaml
依赖项,需要手动选择。