一、Monorepo结构
Monorepo 是管理项目代码的一个方式,指在一个项目仓库 (repo) 中管理多个模块/包 (package),不同于常见的每个模块建一个 repo
├── packages
| ├── pkg1
| | ├── package.json
| ├── pkg2
| | ├── package.json
├── package.json
但是 repo 的体积较大。因为各个 package 理论上都是独立的,所以每个 package 都维护着自己的 dependencies,而很大的可能性,package 之间有不少相同的依赖,而这就可能使install
时出现重复安装,如果package之间相互依赖,开发人员需要在本地手动执行npm link等。目前最常见的 monorepo问题 解决方案是使用 Lerna
工具和 workspaces
特性。
二、workspaces
workspaces(工作区)是一个通用术语,它指的是从单个顶级根包中管理本地文件系统中的多个包。一个pkg可以认为是一个工作区,可以通过配置属性workspace来指定子包(工作区),如npm <cmd> --workspace=./packages/<pkg>
或者npm <cmd> -w /packages/<pkg>
。npm、yarn、pnpm都提供了对workspaces的支持,在使用上会有些微的不同。
npm和yarn都需要在package.json中设置workspaces
{
"workspaces": [
"packages/*"
],
}
pnpm的workspaces的配置都放在pnpm-workspace.yaml文件里,在根目录下新增pnpm-workspace.yaml文件,在该文件中设置。
三、lerna
是一个多包管理工具
1、全局安装
npm i -g lerna
2、初始化项目
在项目文件夹目录下执行
lerna init --independent
lerna的项目目录结构:
- packages
- project1
- src
- index.ts
- package.json
- project2
- src
- index.ts
- package.json
- project3
- src
- index.ts
- package.json
- lerna.json
- package.json