lerna+yarn实现MonoRepo

211 阅读5分钟

前言

现代软件开发中,团队经常需要管理大量的代码库和项目,于是MonoRepo应时而生,并成为许多团队首选的代码管理方式。本文会介绍MonoRepo的相关概念,并使用lerna和yarn实现一个简单的MonoRepo仓库

go.gif

MonoRepo、MultiRepo是什么?各自特点?

MonoRepo(单一存储库)简单的说,就是将多个项目放在同一个仓库管理,与之相对,MultiRepo(多仓库)则是将不同项目分别放入各自的仓库进行管理。

两者有何区别点呢?

其实,区别点也就在其定义上了,仓库的数量不同😅

那么,为啥要如此区分呢?

这也就要谈到其各自的特点了,首先,MonoRepo的优点在于:

  • 代码共享:容易在不同项目之间共享代码和资源,减少重复代码。
  • 一致性管理:统一管理依赖、构建和发布流程,确保一致性。
  • 协作效率:开发团队可以在同一个仓库中协作,代码审查和变更管理更加方便。
  • 依赖管理:跨项目的依赖管理更加简单,减少依赖冲突。

当存在以下几种情况时:需要统一管理多个子项目或模块的大型项目、多个项目之间频繁共享代码和资源、 对依赖、构建和发布流程一致性要求较高;我们就需要考虑使用MonoRepo来管理我们的仓库了。 然而,金无足赤,MonoRepo也有着自己的缺点:

  • 规模问题:仓库规模较大时,可能导致版本控制系统性能下降。
  • 构建时间:随着项目数量增加,构建时间可能变长,需要优化构建流程。
  • 权限管理:需要精细化的权限管理,以确保不同项目的访问控制。

因此,以下几种场景就比较适合使用MultiRepo

  • 各项目相互独立,变更较少影响其他项目
  • 需要为每个项目选择不同的工具和依赖版本
  • 需要对每个项目进行精细化权限管理的情况
  • 项目规模较小,不需要频繁共享代码和资源

我们需要对具体的场景进行分析,再决定使用哪种仓库管理方式。

image.png

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就搭建好了,感兴趣的可以自己试下哦!🤗

谢谢各位观看,如果有问题或者错误欢迎评论区提出哦,不胜感激!🤠

源码在此