我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android MonoRepo多仓和单仓的差别是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android MonoRepo多仓和单仓的差别是什么

这篇文章主要介绍“Android MonoRepo多仓和单仓的差别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android MonoRepo多仓和单仓的差别是什么”文章能帮助大家解决问题。

    前言

    两种模式其实我都略微有点接触,当然文章也存粹是个人观点。我们先看下下面这幅图,其实就是一个原始工程结构,分仓结构,还有单仓结构的工程。

    Android MonoRepo多仓和单仓的差别是什么

    什么是Monorepo

    Monorepo的意思是在版本控制系统的单个代码库里包含了许多项目的代码。这些项目虽然有可能是相关的,但通常在逻辑上是独立的,并由不同的团队维护。

    简单的说当我们把所有的代码全都放在一个仓库内,然后所有同学都在这个仓库上进行开发,这种模式就可以称之为Monorepo

    很多人认为这种形式不就回到了一开始并没有完成组件化的单Project的模式。然而并不是这样的,Monorepo内还是会有分层结构设计,也具有组件化的所有,只是所有的源代码聚合在一个仓库内,每个同学也是在自己负责的业务模块中开发的。

    这种有什么好处呢?那么他的缺点是什么呢?接下来要介绍下他的兄弟,然后可能双向对比才能说明这到底是个啥东西。

    什么是multi-repo

    一个项目由多个git仓库来构成,然后通过依赖aar的形式将几个仓库组合在一起。

    现在市面上大部分公司的解决方案应该都是多仓,然后通过插件将多个工程同步aar版本配置的形式完成的multi-repo模式。

    基本上每个业务会独立成一个仓库,然后基础库也会变成一个独立的仓库,然后通过依赖aar的方式来引入其对其他仓库的依赖的形式进行开发。我把这种模式叫做multi-repo

    多仓模式下因为各个project都是独立的,所以配置统一,依赖管理等等一直都是个老大难的问题, 但是也并非无解,很多公司包括我以前都会写一个依赖版本清洗的插件,然后将依赖的ext放在远端,之后基于branc分支的形式提供给到各个使用的业务方。

    multi-repo的问题

    我以前在哈啰的时候遇到过一个场景,我们依赖于业务方的代码,然后业务方也依赖与我们的代码,然后就变成我先发布个快照版本给到对方,然后他们基于我们的快照版本再进行代码开发,之后我再把他们的快照版本更新过来,进行代码开发的情况。

    一般情况下可能还好,但是如果万一有人不小心更改到api的方法入参或者一些函数的名字。那么在最后的编译阶段会出现运行是出现方法找不到的问题,然后出现崩溃的问题,这种问题发生的次数应该是非常的多的。

    因为代码的隔离情况,所以大家都在自己的分支和仓库上独立开发,对于别人的代码处于一个低感知的状态,所以自然而然的我认为代码上是一个不稳定的状态。

    很多公司最后会在交付阶段采用全源代码进行编译的方式给到最终的apk。原理就是通过一个aar切换源代码的插件,然后把所有工程聚合在一起进行打包,避免出现一些非必要的编译问题。

    还有就是项目重构以及项目持续升级,多仓需要对每一个工程都设置一套ci/cd体系,还有就是分支管理等等问题就会不停的消耗开发的精力,同时因为大家都是自己的一套系统,后面就会出现不可避免的内卷。

    我听一个网友说过一个案例,因为是aar的依赖方式,所以他们在自己的模块中直接依赖了对方的项目,然后对方的项目也直接依赖了他们的aar产物,在实际开发中,这种依赖成环的现象是一定要避免的,但是在多仓中他也不一定会报错提示。

    另外则是一些统一的升级操作,比如说AGP版本升级,koltin版本升级,gralde 插件版本等等配置信息的升级。

    代码复用率方面多仓可能会更低一点。每个业务可能都会有一些可能更优秀的代码实现,但是如果你想复用的这个就会相对比较糟糕,可能就会涉及到大量的代码cv。一个稳定的功能还好,如果是一个还在迭代过程中的代码,多仓反倒更容易出现代码风险。

    multi-repo的优点

    相对来说多仓的工程结构会更独立,每个工程都是具有独立打开的能力的,这样对于业务同学来说,他的学习成本是相对最低的,因为他基本上只要对自己的业务模块负责就可以了,更专注与自己当前所需要关心的。

    工程同步和编译的速度会更快,因为大部分仓库都已经被编译成aar产物了,所以对于分仓模式来说,他们的同步和编译都只需要对于当前工程负责就可以了,不需要编译与当前工程无关的东西,所以速度上来说会更快。

    学习成本低,因为只要对当前工程负责,所以只要搞懂当前工程如何能工作就可以了。

    安全性相对来说会更高,因为工程结构相对独立,所以对于一些相对涉密的工程来说,分仓的结构的安全性会更高,即时看到代码也无权进行任何代码变动。

    MonoRepo的缺点

    相比较于分仓模式,MonoRepo的编译速度会更慢,同步的时间也会更长。因为每个工程都需要重新Configuration策略,将aar依赖方式切换成源代码依赖。同时不同于aar依赖的情况,源代码依赖的情况下每个工程的build.gradle还有全局配置以及插件等都需要被执行到,所以消耗的时间会更长一点点。也就是正常的gradle相关的生命周期,对于源码编译的工程都是需要执行一次的。

    工具链相对来说会比较复杂,因为所有源代码都在一起,所以工程内可能需要配置更多ndk等等配置环境,需要更多的工具链将这些仓库进行协调,从而能达到混编的状态下。

    安全性相对来说较差,比如说相对机密的公司核心源代码。因为单仓的缘故,所以代码的权限就会对所有人开放。如果出现源码泄露的状况,就相对来说比较严重了。

    同时工程体量会变得非常巨大,也会造成编码过程中需要频繁的rebase主干的代码,可能每天都会有巨量的代码落后的情况。但是这个个人觉得是在可预期范围内的。

    MonoRepo的优点

    要说到MonoRepo的优点,其实也都是相对于分仓模式来说的。

    首先要提出的第一个观点是开发状况下你的仓库状态是稳定的。工作流程上来说,都是切出一个分支,然后在这个分支上开发自己的业务需求,之后合并回主干。但是和多仓相比,即使是多人协作开发,因为大家所使用的都是源代码,只要拉取了代码各自的变更都是当场可见的。每一个提交相对来说都是知道彼此互相做了什么事情的,所以这就是相对来说的稳定切片。就算我们重新rebase了主干之后,这部分代码也是相当稳定的一个状态,因为他们都是编译完测试完成之后才合入的。即使代码变更了,因为有编译阶段的语法校验,所以所有的改动都是一个相对来说的稳定状态。

    这一点我认为是非常重要的一点。对比与多仓,因为每个人都在自己的仓库可以提交代码,彼此的提交都是互相隔离分立的,所以我们无法预知到对方的改动是否会对当前的我们产生影响,这就导致了存在更多的风险。这个也就是MonoRepo所说的原子提交。

    高参与度与代码的可复用性,因为所有代码对大家都是可见的状态,所以当我们需要一些我们想要的代码的时候,并不需要直接去cv他们,而可以直接通过依赖的形式直接获取到他们的使用权。如果碰到我们前面所说的不稳定状态的情况下,因为大家都能参与到代码的改动中,所以我们可以让我们的代码更趋于一个稳定状态,而不是打补丁的方式这里改一句哪里改一句。

    更有效的依赖检查,前面所说的模块间互相依赖成环的问题,MonoRepo也是不存在的,依托于编译器的特性,当依赖成环的情况下,编译自然就会报错。这样就可以避免掉一些错误的写法。

    更简便的代码升级操作,之前和大家介绍过我们当前的AGP的版本相对来说已经是比较高的版本了,我们的插件数量其实也很多,我们也有插件化等等黑科技。在编译阶段上我们也魔改了不少代码。但是因为我们的单仓结构,我们可以只需要改动一个version版本号就可以对所有的仓库生效。快速的将app进行持续的迭代操作。

    单一的检查工具,这部分就是避免重复性建设的工作了,因为仓库单一所以只要对当前仓库进行一份静态检查就行了,避免重复造轮子的风险。

    关于“Android MonoRepo多仓和单仓的差别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Android MonoRepo多仓和单仓的差别是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Android MonoRepo多仓和单仓的差别是什么

    这篇文章主要介绍“Android MonoRepo多仓和单仓的差别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android MonoRepo多仓和单仓的差别是什么”文章能帮助大家解决问题。
    2023-07-02

    SEO和竞价推广的差别是什么

    这篇文章主要为大家展示了“SEO和竞价推广的差别是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEO和竞价推广的差别是什么”这篇文章吧。竞价就是花钱在搜索引擎上买广告位。例如,用百度搜索“
    2023-06-10

    物理机和云主机的差别是什么

    物理机和云主机是两种不同的计算机资源使用方式,它们的主要差别如下:1. 硬件资源:物理机是实际的物理设备,包括处理器、内存、硬盘等,而云主机是基于虚拟化技术运行在物理机上的虚拟机,共享物理机的硬件资源。2. 灵活性和可扩展性:云主机具有较高
    2023-09-17

    android和java的区别是什么

    从整体来讲,java和android的区别在于android程序是基于组件和配置的,而且android开发以java语言为开发工具,表面上看他们有点同宗不同门,但实际上区别十分大,android是一个主流智能手机操作系统,java是一种开发语言,两者没有好坏之
    android和java的区别是什么
    2019-02-19

    CentOS 8 和 RHEL 8 服务器上启用 EPEL仓库的方法是什么

    这期内容当中小编将会给大家带来有关CentOS 8 和 RHEL 8 服务器上启用 EPEL仓库的方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。EPEL 代表 “Extra Packages f
    2023-06-05

    云主机和独立服务器的差别是什么

    云主机和独立服务器之间的最主要差别在于其物理资源的分配方式和管理方式。1、物理资源分配方式:云主机:云主机是基于虚拟化技术实现的,物理服务器资源被划分成多个虚拟机实例,每个云主机可以独立分配CPU、内存、存储等资源。多个云主机可以共享同一
    云主机和独立服务器的差别是什么
    2024-05-15

    SSL证书中单域名和多域名的区别是什么

    SSL证书中单域名和多域名的区别主要体现在证书可以覆盖的域名数量上。具体来说,单域名SSL证书只能用于保护一个特定的域名,而多域名SSL证书则可以用于保护多个不同的域名。单域名SSL证书适用于只有一个域名的网站,例如www.example
    SSL证书中单域名和多域名的区别是什么
    2024-05-09

    android插桩和hook的区别是什么

    Android插桩和Hook是两种不同的技术,用于在Android应用程序中修改或拦截代码的执行。插桩(Instrumentation)是一种在编译或运行时修改已有代码的技术。它可以通过在代码中插入额外的指令或代码段来实现对目标代码的修改。
    2023-09-20

    Android中post和send的区别是什么

    在Android中,"post"和"send"都是用于发送消息的方法,但它们具有一些区别。1. post:post方法用于在主线程的消息队列中发布一个消息并立即返回。这意味着消息可能不会立即处理,而是在主线程中的消息队列中等待执行。通常情况
    2023-09-27

    android中handler.post和handler.sendMessage的区别是什么

    本篇文章给大家分享的是有关android中handler.post和handler.sendMessage的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 异步更
    2023-05-30

    传统服务器和云服务器的差别是什么

    传统服务器与云服务器对比概念:传统服务器为物理设备,由用户拥有和维护。云服务器为虚拟服务器,由云服务提供商托管和维护。部署:传统服务器需要购买、安装和配置硬件,部署时间长。云服务器部署时间短,可快速扩展或缩减。硬件:传统服务器用户负责维护硬件,云服务器则由服务提供商管理。可扩展性:传统服务器拓展性受限,云服务器可按需动态拓展资源。成本:传统服务器前期硬件投入高,云服务器按使用付费,降低前期投资。安全:传统服务器用户负责安全,云服务器提供商提供安全措施,如防火墙和入侵检测。可靠性:云服务器具有冗余和容错机制
    传统服务器和云服务器的差别是什么
    2024-04-10

    Android中layout gravity和gravity的区别是什么

    在Android中,layout_gravity和gravity是用来控制View的对齐方式和位置的属性。1. layout_gravity:该属性用于控制View在父容器中的位置。它可以设置为左上角、左中、左下角、右上角、右中、右下角、居
    2023-10-09

    APP测试中IOS和Android的区别是什么

    这篇文章主要介绍“APP测试中IOS和Android的区别是什么”,在日常操作中,相信很多人在APP测试中IOS和Android的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”APP测试中IOS和A
    2023-06-05

    C#中异步和多线程的区别是什么

    本篇内容介绍了“C#中异步和多线程的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、区别和联系异步和多线程有什么区别?其实,异步
    2023-06-30

    C语言单精度和双精度的区别是什么

    C语言中的单精度和双精度是两种不同的浮点数表示方式。1. 单精度(float):单精度浮点数使用32位(4字节)来存储,其中1位用于表示正负号,8位用于表示指数部分,23位用于表示尾数部分。单精度浮点数的精度约为7位有效数字。2. 双精度(
    2023-08-16

    在php中单引号和双引号的区别是什么

    这篇“在php中单引号和双引号的区别是什么”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“在php中单引号和双引号的区别是什么”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接
    2023-06-06

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录