[toc]
1、项目结构
pnpm 内置了对单一存储库(也称为多包存储库、多项目存储库或单体存储库)的支持。 你可以创建一个工作空间以将多个项目合并到一个仓库中。
my-monorepo
|-- apps
| |-- web # 主应用
| |-- package.json # 依赖 @my-monorepo/ui
|-- packages
| |-- ui # 核心库
| | |-- package.json # 包名为 @my-monorepo/ui
|-- package.json
|-- .npmrc => optional
|-- pnpm-workspace.yaml
一个工作空间必须在它的根目录有一个 pnpm-workspace.yaml
文件。 工作区在其根目录中也可能有一个 .npmrc
。
根目录 package.json
私有化为 true 时,在 publish 时 npm 将不会处理该 package,你可以在项目的根目录配置,或在不需要被 publish 的 workspace 中配置它
json
/my-monorepo/package.json
{
"name": "my-monorepo",
"private": true,
"script": {
"dev": "pnpm -r dev"
}
}
pnpm-workspace.yaml
在该项目中指定位于
my-monorepo/apps/
和my-monorepo/packages/
内的直接子目录为工作区如 web、ui等
yaml
packages:
- "apps/*"
- "packages/*"
2、什么是 workspace:^ - semver 版本
当你将依赖项添加到 package.json
中时,pnpm 根据 .npmrc
或命令行中的 ave-workspace-protocol
字段来决定是否使用 workspace: 协议,并根据 save-prefix 字段来决定版本的前缀。
json
JSON
{
"dependencies": {
"foo": "workspace:*",
"bar": "workspace:~",
"qar": "workspace:^",
"zoo": "workspace:^1.5.0"
}
}
转换
json
{
"dependencies": {
"foo": "1.5.0",
"bar": "~1.5.0",
"qar": "^1.5.0",
"zoo": "^1.5.0"
}
}
workspace:*
的作用
"@my-monorepo/ui": "workspace:*",
- 自动链接:pnpm 会自动将
@my-monorepo/ui
链接到工作区内的对应包,无需手动使用pnpm link
。 - 实时同步:修改
@kawafe/core
的代码会立即反映在依赖它的项目中,适合本地开发和调试。 - 版本管理:无需手动指定版本号,pnpm 会自动使用工作区内的最新版本。
workspace:*
替代方案
link:../ui
如果项目不在同一仓库中,可以使用 link:../ui
手动链接:
file:../ui
file:../ui
也是一种本地路径依赖,但与 workspace:*
不同,它会复制文件而不是链接:
3、常用命令
bash
# 给指定 workspace 安装依赖
pnpm add <package-name> --filter <workspace-name>
# 卸载依赖
pnpm uninstall <package-name> --filter <workspace-name>
# 更新依赖
pnpm update <package-name> --filter <workspace-name>