google为什么使用mono-repo

蓝咒 提交于 2021-01-26 14:36:18

google为什么使用mono-repo

三丰 soft张三丰

什么是monorepo?

Monorepo 它是一种管理 organisation 代码的方式,在这种方式下会摒弃原先一个 module 一个 repo 的方式,取而代之的是把所有的 modules 都放在一个 repo 内来管理。

目前诸如 Babel, React, Angular, Ember, Meteor, Jest 等等都采用了 Monorepo 这种方式来进行源码的管理。

git 多仓库管理的缺点

1.管理调试困难
2.分支管理混乱
3.依赖关系复杂
4.三方依赖版本可能不一致
5.占用总空间大
6.不利于团队协作




单体,多仓库,单体仓库

google为什么使用mono-repo
单体应用 到 多仓库 到单体仓库

单体仓库的优点:代码规范易于管理 配合自动化工具能够做到一键构建,一键部署 易于理解项目整体,开发人员有一个更好的全景视图 易于重用

谁在用monorepo

google为什么使用mono-repo

bazel

Bazel 是 Google 的一款可再生的代码构建工具。它主要是用于构建 Google 的软件,处理出现在谷歌的开发环境的构建问题,比如说:大规模数据构建问题,共享代码库问题,从源代码构建的软件的相关问题。

Bazel 支持多种语言并且跨平台,还支持自动化测试和部署、具有再现性(Reproducibility)和规模化等特征。Bazel 在谷歌大规模软件开发实践能力方面起着至关重要的作用。
google为什么使用mono-repo

Buck

BUCK 是 facebook 开源的安卓高速构建系统,速度完爆 gradle ,更多细节,请自行搜索。

10 行配置从 Android Studio + Gradle 构建体系迁移到 facebook 的 BUCK 构建体系,且保持两者同时兼容使用,编码使用 AS ,享受安卓最强大 IDE 的功能,打包、安装、测试用 BUCK ,享受安卓最快构建系统的畅快淋漓,两者互不干扰。从此妈妈再也不用担心我在编译安卓工程时睡着了,而且真的只要 10 行!

Github 地址:https://github.com/Piasy/OkBuck/blob/master/README-zh.md

示例

一个理想的 monorepo 结构:


.
├── packages
│      ├─ module-a
│      │    ├─ src            # 模块 a 的源码
│      │    └─ package.json   # 自动生成的,仅模块 a 的依赖
│      └─ module-b
│           ├─ src            # 模块 b 的源码
│           └─ package.json   # 自动生成的,仅模块 b 的依赖
├── tsconfig.json             # 配置文件,对整个项目生效
├── .eslintrc                 # 配置文件,对整个项目生效
├── node_modules              # 整个项目只有一个外层 node_modules
└── package.json              # 包含整个项目所有依赖

所有全局配置文件只有一个,这样不会导致 IDE 遇到子文件夹中的配置文件,导致全局配置失效或异常。node_modules 也只有一个,既保证了项目依赖的一致性,又避免了依赖被重复安装,节省空间的同时还提高了安装速度。

兄弟模块之间通过模块 package.json 定义的 name 相互引用,保证模块之间的独立性,但又不需要真正发布或安装这个模块,通过 tsconfig.json 的 paths 与 webpack 的 alias 共同实现虚拟模块路径的效果。

总结

现在微服务在业界比较认可的就是monorepo的结构,使用这种方式构建的微服务能够快速开发,快速迭代,而且不影响项目的复用性。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!