当前位置: 首页 > 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

相关文章:

Monorepo简介

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

SpringBoot打包为jar包,打包前注意事项及打包教程

在打包 Spring Boot 项目为 JAR 包之前,有一些重要的注意事项和步骤,以确保打包过程顺利并生成一个可正常运行的 JAR 包: 1. 检查依赖和版本 确保所有依赖项和插件版本是最新且兼容的,特别是 Spring Boot 版本和其相关依赖的版本…...

B端系统UI个性化设计:感受定制之美

B端系统UI个性化设计:感受定制之美 引言 艾斯视觉作为ui设计和前端开发从业者,其观点始终认为:在当今竞争激烈的商业环境中,B端(Business-to-Business)系统的设计不再仅仅是功能性的堆砌,而是…...

前端常用 utils 工具封装

// 函数防抖 export function debounce(fn, interval) {let timerreturn function (this, ...args) {clearTimeout(timer)const context thislet params [...args]timer setTimeout(() > {fn.call(context, ...params)}, interval || 1000)} }// 函数节流 export functio…...

项目都做完了,领导要求国际化????--JAVA后端篇

springboot项目国际化相信各位小伙伴都会,很简单,但是怎么项目都做完了,领导却要求国际化文件就很头疼了 国际化的SpringBoot代码: 第一步:创建工具类 /*** 获取i18n资源文件** author bims*/ public class Message…...

国内备受好评PostgreSQL数据库性能如何?

为什么国内很多数据库采用PostgreSQL数据库作为基础,再次开发自己的产品呢?不仅仅是因为PostgreSQL数据库开源免费、PostgreSQL 数据库的性能也是相当出色的,具有以下几个方面的特点: 1. 处理大规模数据: - 能够有效地管理和处…...

彻底搞懂前端跨域解决方案

一、浏览器的同源策略 1、同源策略概述 同源策略是浏览器为确保资料安全,而遵循的一种策略,该策略对访问资源进行了一些限制。 2、什么是源(origin)? 3、示例 4、同源请求 5、非同源请求 二、跨域会受到哪些限制 1…...

Kafka基础概念

MQ消息中间件 1)总览: 消息中间件 这里我们主要学习的是kafka的基础概念 具体参考黑马头条:https://www.bilibili.com/video/BV1Qs4y1v7x4/?spm_id_from333.337.search-card.all.click 2)消息中间件对比 3)Kafka介…...

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models

1 引言 现有3D生成模型: 3D点云:大量离散的3D点组成的数据表示形式; 多边形网格:一系列相连的多边形组成的3D模型; 水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部…...

《如鸢》开通官号,女性向游戏爆款预定

今天,备受瞩目的沉浸式剧情卡牌手游《如鸢》正式开通了官方社媒账号并发布了玩家信。 《如鸢》由灵犀互娱倾力打造,游戏不仅拥有跌宕起伏的权谋剧情,更采用Live2D技术,为玩家带来沉浸式的游戏体验,吸引了众多玩家关注。…...

OpenAI再下一城:发布Voice Engine,可使用文本和参考语音合成说话者的新语音!

转自 机器学习算法工程师 OpenAI又发布了一个最新的工作:Voice Engine。Voice Engine可以使用文本输入和单个 15 秒音频样本生成听起来自然且与原始说话者非常相似的语音。而且,一个小型模型仅通过一个 15 秒的样本就能创造出富有情感且逼真的语音。Voi…...

KVM高级功能部署

一、概述 KVM(Kernel-based Virtual Machine)是一种基于内核的虚拟化技术,它依赖于CPU的虚拟化扩展(如Intel VT和AMD-V)来实现虚拟机的创建、管理和调度。KVM虚拟化技术因其高效、稳定的特点,在云计算和企…...

【C语言】柔性数组(打开前所未见的大门)

文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言 说到柔性数组,相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系,相信本章能够带你从到认识到掌握柔性数组,做一个充满知识…...

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…...

react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示

在 React 中,defaultValue 是一个非受控属性,而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值,但是它们的工作方式有所不同。 value:这是一个受控属性,意味着输入框的值由 React 状态控制。每当状态…...

大模型开发如何把一段文字变成一组token?

在大模型开发中,将一段文字变成一组token通常称为"tokenization"(分词)。这是自然语言处理中的一个关键步骤,主要是将连续的文本划分成离散的单元(token),这些单元可以是单词、子词或…...

【MSYS】Windows Terminal 集成

Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置: "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…...

Python酷库之旅-第三方库Pandas(056)

目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…...

ZBrush入门使用介绍——4、笔刷选项说明

大家好,我是阿赵。   这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷,可以打开笔刷选择面板。 在最上面的Quick Pick,有最近使用过的笔刷,可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多,…...

Java每日一练,技术成长不间断

目录 题目1.下列关于继承的哪项叙述是正确的?2.Java的跨平台特性是指它的源代码可以在多个平台运行。()3.以下 _____ 不是 Object 类的方法4.以下代码:5.下面哪个流类不属于面向字符的流()总结 题目 选自牛…...

项目管理和技术管理的区别

在单位从事管理岗快2年了,负责单位内的研发项目管理和技术管理工作。感觉这是两个不同的管理赛道。其中项目管理侧重进度、资源、风险、责任人、排期等要素推进和汇报。技术管理则侧重研发环节的技术深度、技术方向、技术领先性、技术栈,以及项目产出的质…...

Java开发必看:解决国密SM2算法报错‘Unknown named curve‘的完整指南(附Bouncy Castle配置)

Java开发实战:国密SM2算法Unknown named curve报错深度解析与Bouncy Castle最佳配置指南 金融级Java应用开发中,国密算法SM2的集成就像在钢筋森林里铺设光纤——看似简单却暗藏技术陷阱。当控制台突然抛出Unknown named curve: 1.2.156.10197.1.301这个看…...

Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意

Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意 1. 为什么要分享你的使用经验 当你成功部署并体验了Pixel Couplet Gen后,可能会发现一些独特的用法或优化技巧。把这些经验分享出来,不仅能帮助其他开发者少走弯路&#xff0…...

基于Pixel Epic · Wisdom Terminal的MySQL智能运维:安装配置与性能调优

基于Pixel Epic Wisdom Terminal的MySQL智能运维:安装配置与性能调优 1. 引言 MySQL作为最流行的开源关系型数据库,在各类业务系统中扮演着核心角色。但传统的数据库运维往往面临几个痛点:配置参数复杂难懂、SQL优化依赖经验、性能问题排查…...

158页精品PPT | 某大型研发制造集团信息化IT规划整体方案

许多公司在数字化转型过程中会遇到一些共同的挑战,比如数据孤岛、技术更新慢、员工技能不足等。这些问题会导致企业效率低下,难以适应市场变化。针对这些问题,我们提出了一套解决方案,核心目标是帮助企业提升数字化水平&#xff0…...

基于Moondream2的工业质检系统:缺陷检测与分类

基于Moondream2的工业质检系统:缺陷检测与分类 1. 为什么传统质检方式正在被重新思考 产线上的质检员每天要盯着成百上千件产品,眼睛酸涩、注意力下降,漏检率悄悄爬升。一台设备表面划痕只有0.1毫米宽,人眼在连续工作两小时后&a…...

PyTorch 2.8镜像一键部署教程:支持Slurm集群调度的HPC环境快速接入

PyTorch 2.8镜像一键部署教程:支持Slurm集群调度的HPC环境快速接入 1. 镜像概述与核心优势 PyTorch 2.8深度学习镜像是一个经过深度优化的高性能计算环境,专为现代AI工作负载设计。这个预配置环境最大的特点是开箱即用,免去了繁琐的环境配置…...

[Linux][虚拟串口]x一个特殊的字节

目标:构建带上下文记忆的猫咪聊天机器人 先看代码: from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.messages import SystemMessage,HumanMessage,AIMessage import os from dote…...

SmallThinker-3B-Preview赋能Java后端:智能客服系统数据库设计

SmallThinker-3B-Preview赋能Java后端:智能客服系统数据库设计 最近在做一个Java后端的智能客服项目,核心是要接入一个轻量级的AI模型——SmallThinker-3B-Preview。模型选好了,代码逻辑也搭得差不多了,但一到数据库设计这块&…...

一步步教你获取ADNI影像数据:从搜索到下载全流程解析

1. ADNI数据库简介与准备工作 ADNI(Alzheimers Disease Neuroimaging Initiative)是全球最权威的阿尔茨海默病研究数据库之一,包含了大量脑部影像数据和临床信息。第一次接触这个数据库的研究者可能会被复杂的界面和操作流程吓到,…...