Pnpm 与 Monorepo

什么是 Monorepo 与工作空间

Monorepo 是一种将多个项目放在一个仓库中的开发模式,通常用于大型项目或团队协作,其可以方便地管理多个项目的依赖关系,提高开发效率,同时也可以方便地共享代码和资源。

至于将多个项目放在多个不同的仓库中的开发方式,则称之为 MultiRepo

工作空间(Workspace) 是Pnpm中的一种内置功能,一个工作空间就可以将多个项目合并到一个仓库中。

创建package.json

首先在我们仓库的根目录下创建一个package.json文件,写入如下内容:

1
2
3
4
5
{
"name": "monorepo",
"private": true,
"script": {}
}

注意到private设置为了true,用于防止工作空间本身被意外地发布到npm。

创建pnpm-workspace.yaml

在仓库的根目录下面创建一个pnpm-workspace.yaml,其定义了工作空间的项目目录,也可以用于排除不需要包含在其中的目录,如:

1
2
3
4
5
6
7
8
9
10
packages:
# 指定根目录某一子目录中的包
- 'app'
# packages/ 首层子目录中的所有包
- 'packages/*'
# components/ 所有子目录中的所有包
- 'components/**'
# 排除测试目录中的包
- '!**/test/**'

在这个例子中,我们定义了三个包目录,分别是:

  • 根目录下的app目录;
  • packages目录下的首层子目录;
  • components目录下的所有子目录;

同时,我们排除了test目录下的所有包。

接下来,我们可以在packages目录下创建我们的项目,如:

1
2
3
4
5
6
7
// 文件路径:packages/app-1/package.json
{
"name": "monorepo-app-1",
"version": "1.0.0",
"dependencies": {
}
}
1
2
3
4
5
6
7
// 文件路径:packages/app-2/package.json
{
"name": "monorepo-app-2",
"version": "1.0.0",
"dependencies": {
}
}

安装依赖

首先是为工作空间安装依赖:

1
pnpm add <package-name> -w

-w参数表示为工作空间安装依赖,而不是为某个具体的包安装依赖。

然后是为某个具体的包安装依赖:

1
pnpm add <package-name> --filter <filiter>

--filter参数用于指定为哪个包安装依赖,如:

  • pnpm add lodash --filter monorepo-app-1表示为monorepo-app-1包安装lodash依赖;
  • pnpm add lodash --filter "@monorepo/*"表示为工作空间中所有以monorepo-开头的包安装lodash依赖。

具体的语法请参阅官方文档

安装内部依赖

安装工作空间中的某个包作为另一个包的依赖,与安装普通依赖类似:

1
pnpm add <package-name> --filter <filter> --link-workspace-packages=true

注意到使用了link-workspace-packages选项,这将会把工作空间中的包链接到当前包的node_modules中,而不是从注册表中下载。

我们也可以在.npmrc中将其设置为true,这样就不用每次安装的指定这个选项了:

1
link-workspace-packages=true

除此之外,我们也可以在package.json中通过向依赖版本号添加workspace:前缀来强制使其链接到工作空间中的包,如:

1
2
3
4
5
{
"dependencies": {
"monorepo-app-1": "workspace:1.0.0"
}
}

更新与卸载依赖

更新工作空间中的依赖:

1
pnpm update -w

更新某个具体的包的依赖:

1
pnpm update --filter <filter>

卸载工作空间中的依赖:

1
pnpm remove <package-name> -w

卸载某个具体的包的依赖:

1
pnpm remove <package-name> --filter <filter>

执行脚本

执行工作空间中所有脚本:

1
pnpm run <script> -r

-r参数将从每个包的scripts对象中运行任意的命令;

如果一个包没有相应的命令,将被跳过,如果没有任何的包有此命令,该命令将会执行失败。

发布

发布工作空间中的所有包:

1
pnpm publish -r

总结

Pnpm 与 Monorepo 的结合使用,可以方便地管理多个项目的依赖关系,提高开发效率,同时也可以方便地共享代码和资源。

以下是一些常用的命令:

1
2
3
4
5
pnpm add <package-name> --link-workspace-packages=true
pnpm update --filter <filter>
pnpm remove <package-name> -w
pnpm remove <package-name> --filter <filter>
pnpm run <script> -r

© 2026 杂货铺

Elegant theme by Shiro · Made by Acris with ❤️