Monorepo开发策略详解
目录
一:什么是 Monorepo?
Monorepo 是一种将多个项目存放在同一个代码库中的开发策略。”mono” 表示单一 ,“repo” 是”repository”的缩写,意为多个项目共用一个代码库来管理依赖关系,同一套配置文件,统一构建部署流程等
二:Monorepo 和其他结构的区别:
首先,从上图中可以看到,对于Monorepo 和 Monolith repository ,他们之间有类似的地方,但不完全一样。Monolith repository 结构的项目,就如同一个整体,里面的每个部分脱离了这个项目都无法工作。而组成 Monorepo 的项目,或者说功能块,则是像积木一样,有自己的输入和输出,即使我们把它从这个项目中拆离出去,它也能自给自足,实现自己的功能。
其次,对于Monorepo,与之相对的是另一种流行的代码管理方式 MultiRepo,即每个项目对应一个单独的仓库来分散管理。作为传统的管理方式,Multirepo具备灵活度高、安全控制等特点,但同时也带了管理成本和写作成本的增加,依赖升级等问题。
从下图中可以明显的看出二者之间的区别:
三:Monorepo的优缺点
3.1.优点
1. 代码复用非常简单
在 Monorepo 中,由于所有的代码都在同一个项目下,如果引用其他一些已经定义过的功能模块,会非常方便。
我们只需要将复用频率高的代码,单独抽离出来成为一个 shared 之类的项目,那么其他所有的项目都只需要直接引用这个项目下的代码就可以了。而不用将这个项目重新打包,再在其他项目中使用。
2. 简化依赖管理
以往多个项目可能有一些相同的第三方依赖包,每个项目都需要下载一遍,而我们使用 Monorepo 的框架重构项目之后,这些依赖包就可以避免重复下载,同时也能通过配置在不同的项目之间复用。
3. 易于代码重构
当我们的一个库会影响到很多个项目时,修改了这个库之后,以往我们需要一个一个去更新对应受到影响的项目,进行相应的兼容适配工作,而修改一个问题又可能导致另外一个兼容问题。
而Monorepo 能够明确知道代码的影响范围,每次提交都会自动变更到受影响的项目中,也能通过编译时的错误检测机制,及时修正对应的代码,避免依赖兼容性问题的重复繁琐处理。
4. 便于跨组合作
由于 Monorepo 的项目是由一个一个独立的项目组成的,因此我们可以在每个子项目中使用自己的工作流和技术架构,即使将几个跨端跨语言的项目都放在一起也完全可以
所以在跨组合作的情况下,通过同一个Monorepo来开发,能省去大量中间沟通和协作的花费。
3.2.缺点
1. 缺乏每个项目的权限控制
Monorepo 由于将所有的子项目集成在同一个大的项目中,对于管理者来说,权限控制会变得很不方便,开发者每次拉取代码都会拉取所有的代码,无法进行精准的权限控制。
不过现在部分主流 Monorepo 框架都进行了这方面的功能开发。
2. 性能差
代码增多之后,整个git项目会变得越来越大,开发者拉取代码的时间也会变得更长。
3. 构建时间更长
由于有很多个项目和功能模块,Monorepo 在构建时势必会花费更多的时间。
四:如何使用Monorepo
核心思路就是采用yarn包管理工具及它的workspace功能。加上lerna工具来配套使用
- yarn workspaces:Yarn提供的monorepo的依赖管理机制
- lerna:一个开源的管理工具,用于管理包含多个软件包(package)的JavaScript 项目