catalog(目录协议)
目录是工作区功能,用于将依赖版本范围定义为可重用常量,目录中定义的常量可以在
package.json
中使用,结合
pnpm-workspace.yaml
使用
- 定义
pnpm-workspace.yaml
packages:定义多仓库
javascript
packages:
- 'packages/*'
catalog:
chalk: ^4.1.2
catalogs:
react16:
react: ^16.7.0
react-dom: ^16.7.0
react17:
react: ^17.10.0
react-dom: ^17.10.0
这里有两种方式定义 catalog
- catalog
普通定义,一一对应,默认值为
default
javascript
// pnpm-workspace.yaml
catalog:
chalk: ^4.1.2
javascript
// packages/app/package.json
{
"name": "app",
"dependencies": {
"chalk": "catalog:"
}
}
- catalogs
具名,将多个
catalog
整合成一个catalogs
javascript
// pnpm-workspace.yaml
catalogs:
react16:
react: ^16.7.0
react-dom: ^16.7.0
react17:
react: ^17.10.0
react-dom: ^17.10.0
javascript
// 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
依赖项,需要手动选择。