前言
现代软件开发中,团队经常需要管理大量的代码库和项目,于是MonoRepo应时而生,并成为许多团队首选的代码管理方式。本文会介绍MonoRepo的相关概念,并使用lerna和yarn实现一个简单的MonoRepo仓库
MonoRepo、MultiRepo是什么?各自特点?
MonoRepo(单一存储库)简单的说,就是将多个项目放在同一个仓库管理,与之相对,MultiRepo(多仓库)则是将不同项目分别放入各自的仓库进行管理。
两者有何区别点呢?
其实,区别点也就在其定义上了,仓库的数量不同😅
那么,为啥要如此区分呢?
这也就要谈到其各自的特点了,首先,MonoRepo的优点在于:
- 代码共享:容易在不同项目之间共享代码和资源,减少重复代码。
- 一致性管理:统一管理依赖、构建和发布流程,确保一致性。
- 协作效率:开发团队可以在同一个仓库中协作,代码审查和变更管理更加方便。
- 依赖管理:跨项目的依赖管理更加简单,减少依赖冲突。
当存在以下几种情况时:需要统一管理多个子项目或模块的大型项目、多个项目之间频繁共享代码和资源、 对依赖、构建和发布流程一致性要求较高;我们就需要考虑使用MonoRepo来管理我们的仓库了。 然而,金无足赤,MonoRepo也有着自己的缺点:
- 规模问题:仓库规模较大时,可能导致版本控制系统性能下降。
- 构建时间:随着项目数量增加,构建时间可能变长,需要优化构建流程。
- 权限管理:需要精细化的权限管理,以确保不同项目的访问控制。
因此,以下几种场景就比较适合使用MultiRepo
- 各项目相互独立,变更较少影响其他项目
- 需要为每个项目选择不同的工具和依赖版本
- 需要对每个项目进行精细化权限管理的情况
- 项目规模较小,不需要频繁共享代码和资源
我们需要对具体的场景进行分析,再决定使用哪种仓库管理方式。
lerna及yarn实现MonoRepo
目前,业内前端实现MonoRepo的方式主要有三种,yarn+workspace,lerna或者pnpm,我们选择使用lerna结合yarn的方式来实现,当然,程序员都喜欢新技术🤩,因此,本次采用较新的依赖版本,如下:
- yarn:4.5.2
- lerna:6.5.1
- node:v22.11.0
并且,我们使用vite创建项目。
首先执行下面的命令,其中第一个 -- 表示npm命令的参数结束,npm7+之后需要加上。
npm create vite@latest monorepo-lerna -- --template react-ts
删除掉一些无用目录并新增packages文件夹。
之后在packages文件夹下使用vite 再创建两个项目,这里一个使用vue,一个用react
npm create vite@latest subrepo-react -- --template react-ts
npm create vite@latest subrepo-vue -- --template vue-ts
之后安装yarn,yarn为了其独立性,从2.x开始,采取了独立发布的模式,因此,我们不能用npm直接安装。
参照官网推荐安装方式,我们采用corepack来进行安装。
Corepack是node16.9.0版本后附带的工具,可以直接用来管理 Yarn 和 pnpm 等包管理器的版本。
由于还是实验性质,所以要手动启动
corepack enable
之后执行下面命令安装,注意安装前建议卸载全局安装的yarn和pnpm
yarn set version stable
yarn install
yarn install安装会采用pnp模式,因此项目里不会有node_modules文件夹,反而被.yarn替代,感兴趣的可以点击蓝色链接去了解下
修改package.json 添加workspaces属性如下:
"workspaces": [
"packages/*"
]
重新install
之后尝试使用 yarn workspace subrepo-react dev 启动子项目
这里可能会有报错,react-dom路径解析有问题,一番排查搜索之后,发现是由于vite在window下不支持跨磁盘拿依赖(#15496)
修改 .yarnrc.yml,新增下面这句,就会将依赖安装在项目下
enableGlobalCache: false # This is because the fonts can't be loaded in vite dev...
重新install后再启动就可以了
之后我们安装lerna,lerna结合yarn主要是分工协作,具体如下:
1. Yarn 提供依赖管理,简化 Lerna 操作
- 去重优化:Yarn Workspaces 会自动去重根目录的依赖,减少重复安装的依赖项。
- 软链接管理:子包之间的依赖通过软链接管理,避免手动链接。
- 性能提升:Yarn 使用并行依赖安装和缓存机制,速度快于传统的
npm install。
2. Lerna 提供高级功能
- 版本发布:Lerna 的版本管理功能可以独立管理包的版本。
- 跨包脚本执行:可以使用
lerna run运行多个包内的脚本。 - 依赖引导:使用
lerna bootstrap自动设置子包之间的依赖关系。
3. CI/CD 集成更简单
- Yarn 的
workspaces和 Lerna 的changed功能相结合,可优化 CI/CD 流程:
我们这里使用其实主要起个装饰作用(提升逼格)🤪
执行下面这个指令安装 lerna
npx lerna init
修改lerna.json如下:(直接复制的话要去掉注释哦!)
{
"useWorkspaces": true,//启用 Yarn Workspaces 功能,用于优化依赖管理
"packages": [
"packages/*"
], //指定子包
"npmClient": "yarn", // 指定使用的包管理工具
// "version": "0.0.0",统一版本
"version": "independent" //子仓库版本独立
}
其实可以添加schema用于代码提示的,这里没有配置,除了这些之外,也可以去官方配置查看支持的配置
至此,一个简单的monorepo就搭建好了,感兴趣的可以自己试下哦!🤗
谢谢各位观看,如果有问题或者错误欢迎评论区提出哦,不胜感激!🤠