workspace

初始化 monorepo 项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建root project
mkdir mono-project
cd mono-project
pnpm init

# 创建 workspace 配置文件
# pnpm-workspace.yaml
packages:
- "examples/*"
- "shares/*"

mkdir -p examples/app
mkdir -p shares/down-cli

cd examples/app
pnpm init

cd shares/down-cli
pnpm init

配置子项目的package.json文件, app 依赖 down-cli

app/package.json 配置如下

1
2
3
4
5
6
7
8
9
10
{
"name": "app",
"scripts": {
"down": "down --help",
"hi": "echo app hello"
},
"dependencies": {
"down-cli": "workspace:*"
}
}

down-cli/package.json 配置如下:

1
2
3
4
5
6
7
8
9
{
"name": "down-cli",
"scripts": {
"hi": "echo down hello"
},
"bin": {
"down": "bin/index.js"
}
}

down-cli/bin/index.js

1
2
#!/usr/bin/env node
console.log("down command starting..");

安装依赖

在 root project 下面执行 pnpm i, pnpm 会自动安装依赖,子项目间的相互依赖会 link 到对应项目的 node_modules 文件夹下.

比如, 以上的项目结构,app/node_modules/down-cli 会软链接到 down-cli/bin/index.js

执行子项目的命令

配置 root project 的 npm scripts 执行指定子项目的命令

mono-project/package.json

1
2
3
4
5
6
7
8
{
"name": "mono-project",
"scripts": {
"app-hi": "pnpm run --filter app hi",
"app-hi2": "pnpm run --filter ./examples/* hi",
"down": "pnpm --filter app down"
}
}

更多 --filter 参数的用法可查帮助信息 pnpm help run

在 root project 下执行, pnpm down 可测试子项目的命令,实现脚本工具(down-cli)的开发调试

在 root project 下,按照指定子项目的依赖: pnpm add lodash --filter app

同理,发布某个子工程对应的 package, pnpm publish --filter app or pnpm publish --F app