当前位置: 首页 > news >正文

Monorepo简介

Monorepo

  • 第一章:与Monorepo的邂逅
  • 第二章:Multirepo的困境
  • 第三章:Monorepo的魔力 - 不可思议的解决问题能力
  • 第四章:Monorepo的挑战与应对策略
  • 第五章:总结
  • 第六章:参考

第一章:与Monorepo的邂逅

今天和大家介绍一下Monorepo,其实之前工作的很多很多年都没有接触过“Monorepo”这个词,因为之前的多家公司本身就是Monorepo,直到我入职了一家公司采用了multi-repo方式来维护代码,痛苦的使我不得不寻求解决方案(谁让我是开发底层框架的呢,就我最痛苦),因缘际会认识了Monorepo。

  • Multirepo:每个项目使用一个git仓库来管理,或者一个项目中的每个模块用一个仓库来管理
  • Monorepo:多个项目是使用一个git仓库来管理
    在这里插入图片描述

第二章:Multirepo的困境

以下是我根据网上的资料和我遇到的实际问题整理的脑图:
在这里插入图片描述
对于开发维护底层框架的我来说,Multirepo简直是噩梦,最痛苦的三个点:

  • 框架更新困难,没有原子的更新方法,只能每个团队通知,由于更新不及时,好多次导致使用的框架版本不统一,导致有的模块可以启动、有的模块启动不了
  • API维护的战战兢兢,根本不敢丢弃老的接口,要一直背着包袱,因为你不知道哪个仓库就用了
  • 依赖混乱导致架构根本无法统一,当想引入Mediapipe、Taskflow等任务流的执行框架时,发现单进程根本不可能,因为每个模块用的依赖随时都有可能发生变化,一旦导致冲突就会出现无法启动的问题

第三章:Monorepo的魔力 - 不可思议的解决问题能力

当我更新框架版本花了2周后,我终于下定决心要改变这种状态,因为这种状态下框架迭代根本无法实现敏捷开发、Bug无法被快速修复、新功能无法被测试充分,所以我开始学习Monorepo的知识,发现Monorepo真的可以完美解决Multi-repo遇到的问题,并且国外的Google、国内的腾讯等大厂都在使用这种代码管理方式,Monorepo的优势我整理成了简单的脑图来总结一下:
在这里插入图片描述

第四章:Monorepo的挑战与应对策略

当然Monorepo也不是银弹,它也有很多需要解决的问题,比如下图中的挑战:
在这里插入图片描述
在我的工程实践中,对于上面问题的应对措施:

  • 权限控制,直接放弃了,公司非常Open,直接所有人可见、可修改,但是合入主线需要Owner的Approve
  • 性能问题,公司只是某个部门采用Monorepo,代码量还没有巨大到非常恐怖的地步,所以日常浏览、编辑都没有问题,编译性能是通过bazel的remote cache来解决,从全量编译从1小时逐渐优化到10~20分钟
  • 破坏主线,这个需要公约+CICD来约束MR,把控准入标准

第五章:总结

由于不是转门搞CI/CD或DevOps的同学,所以对于Monorepo的认识不是太深刻,总结一下我的认识:
对于代码量没有恐怖到一定程度,不考虑权限问题,那么Monorepo一定适合你的团队,基本没有什么副作用,也有助于建设公司的共享、互助的工程师文化;但是如果你的团队对权限问题要求很高,那就只能做一些妥协,将关键代码单独管理,通过repo或git submodule来和Monorepo大仓一起管理。

第六章:参考

https://new.qq.com/rain/a/20210726A0AD3W00
https://www.cnblogs.com/guxingzhe/p/17587786.html
https://www.163.com/dy/article/E71EEJTA0511K58A.html

http://www.lryc.cn/news/411400.html

相关文章:

  • SpringBoot打包为jar包,打包前注意事项及打包教程
  • B端系统UI个性化设计:感受定制之美
  • 前端常用 utils 工具封装
  • 项目都做完了,领导要求国际化????--JAVA后端篇
  • 国内备受好评PostgreSQL数据库性能如何?
  • 彻底搞懂前端跨域解决方案
  • Kafka基础概念
  • 【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models
  • 《如鸢》开通官号,女性向游戏爆款预定
  • OpenAI再下一城:发布Voice Engine,可使用文本和参考语音合成说话者的新语音!
  • KVM高级功能部署
  • 【C语言】柔性数组(打开前所未见的大门)
  • 设计模式17-适配模式
  • react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示
  • 大模型开发如何把一段文字变成一组token?
  • 【MSYS】Windows Terminal 集成
  • Python酷库之旅-第三方库Pandas(056)
  • ZBrush入门使用介绍——4、笔刷选项说明
  • Java每日一练,技术成长不间断
  • 传知代码-上下位关系自动检测方法(论文复现)
  • 从零开始的MicroPython(二) GPIO及代码应用
  • 嵌入式day15
  • 【电池管理系统(BMS)-01】 | 电池管理系统简介,动力电池和储能电池区别
  • C++ STL partial_sum 用法
  • 诚宜开张圣听不应妄自菲薄
  • Vue3 加载条(LoadingBar)
  • 《CSS创意项目实战指南》:点亮网页,从实战中掌握CSS的无限创意
  • [FBCTF2019]RCEService (PCRE回溯绕过和%a0换行绕过)
  • vue3后台管理系统 vue3+vite+pinia+element-plus+axios上
  • Mysql的事务隔离级别实现原理