Monorepo开发策略详解

news2024/9/26 5:15:00

目录

一:什么是 Monorepo?

二:Monorepo 和其他结构的区别:

三:Monorepo的优缺点

3.1.优点

3.2.缺点

四:如何使用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 项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】—— RunLoop初学

RunLoop 文章目录 RunLoopRunLoop简介RunLoop基本使用Runloop伪代码Runloop模型图 Runloop对象Runloop对象的获取_CFRunLoopGet0方法 RunLoop的相关类RunLoop相关类的实现CFRunLoopRefCFRunLoopModeRef五种运行模式CommonModes什么是Mode Item?Mode到底包含哪些类型…

【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(中国区域高精度同化气象站CMADS)

SWAT水文模型建立及应用: 气象数据的准备 1 简介2 气象数据的准备(中国区域高精度同化气象站CMADS)2.1 数据说明2.2 数据下载 3 CMADS 数据集SWAT子集使用说明3.1 SWAT2009版本3.2 SWAT2012版本 参考 本博客主要介绍气象数据的准备&#xff0…

HulaCWMS呼啦企业网站管理系统 v3.0.4

源码下载:https://download.csdn.net/download/m0_66047725/87630654 HulaCWMS(呼啦企业网站管理系统)是基于ThinkPHP5框架开发,安全高效,包括ThinkPHP5的所有特性。专注于企业、政府单位网站建设,以免费开源的方式,帮…

python - 模块使用详解

前言 Python有非常强大的第三方库,也有非常多的内置模块帮助开发人员实现某些功能,无需开发人员自己造轮子。本文介绍Python的模块。 什么是模块 模块简单来说就是一系列功能的集合体,如果将程序的开发比喻成拼图,模块就是各种…

读懂海尔智家大脑:深度体验的本质是深度生活

了解科技行业的读者,应该都对“大脑”这个名词不陌生。 “黑灯工厂”里指挥生产的“工业大脑”,繁忙机场里运筹帷幄的“航空大脑”,还有智慧城市建设的灵魂“城市大脑”…… 如果家也有一颗总揽全局的大脑,生活会发生什么改变呢&a…

SuperMap GIS基础产品三维GIS FAQ集锦(2)

SuperMap GIS基础产品三维GIS FAQ集锦(2) 【WebGL】桌面对三维缓存设置了最大最小可见高度,在iServer发布三维服务并进行预览是可以看到该效果的,但在前端代码打开该服务,最大最小可见高度效果丢失,请问怎…

Makefile零基础教学(一)初识makefile

从这篇文章开始就开始进入 Makefile 的零基础教程,相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。 文章目录 一、什么是 Makefile,优点?二、什么是 make, 为什么使用make?…

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket,但是在可扩展hash中,得查询Directory(左),存入directory指向的bucket(右)。 下面…

linux线程池、基于线程池的单例模式、读者写者问题

线程池&单例模式 一、什么是线程池二、设计思路三、代码实现四、基于线程池的单例模式4.1 懒汉模式设计思路 五、读者写者问题及读写锁 一、什么是线程池 线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个…

flashback database 深入学习

一.FlashbackDatabase 和 Restore Points 说明 OracleFlashback Database and restore points are related data protectionfeatures that allow you to rewind data back in time tocorrect any problems caused by logical data corruption or user errors within adesignate…

gopher 初探

文章目录 gopher协议简介发送GET请求curlgopher gopher发POST请求 gopher协议 简介 Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是…

【AI绘画】——Midjourney关键词格式解析(常用参数分享)

目前在AI绘画模型中,Midjourney的效果是公认的top级别,但同时也是相对较难使用的,对小白来说比较难上手,主要就在于Mj没有webui,不能选择参数,怎么找到这些隐藏参数并且触发它是用好Mj的第一步。 今天就来…

Motrix 全能型下载神器(时隔两年,重新焕发生机)

简介 Motrix 是一款功能强大的下载管理器,支持 HTTP、FTP、BT、磁力链等多种下载协议,同时还具备浏览器插件和跨平台(Windows、macOS、Linux)的特点。它拥有多线程下载、断点续传、任务调度、自动更新等多种实用特性,…

学习笔记:基于SpringBoot的牛客网社区项目实现(六)之发表帖子 + 评论 + 私信

一、过滤敏感词 二、发布帖子 业务流程: 1、先创建帖子的实体DiscussPost,属性有帖子id,user_id,title,content,type,status,create_time,comment_count,scor…

【Python入门知识】NumPy 数组搜索,案例+理论讲解

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 搜索数组 可以在数组中搜索(检索)某个值,然后返回获得匹配的索引。 要搜索数组,请使用 where() 方法。 实例 查找值为 4 的索引: import numpy as nparr np.…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

车载激光雷达原理+双激光雷达方案+纯激光雷达感知3Dbonding box

集度汽车透露了首款汽车机器人概念车车头部位的设计细节&#xff0c;车前灯和车前盖处激光雷达的设计清晰可见。至此&#xff0c;集度汽车的车前盖、前向双激光雷达自动驾驶技术方案首次曝光。 集度汽车官方也称&#xff0c;“双激光雷达”设计方案极具创新性&#xff0c;激光…

求中位数?

文章目录 如何求一个中位数&#xff1f;[295. 数据流的中位数](https://leetcode.cn/problems/find-median-from-data-stream/)常规思路&#xff1a;解决思路&#xff1a; 如何求一个中位数&#xff1f; 如果输入一个数组&#xff0c;让你求中位数&#xff0c;简单的解决方法就…

不合格机器人工程讲师如何坦然面对失败

能坦然面对的重要原因是我自己从一开始就知道注定要失败的&#xff0c;或者说失败率接近99.9%。 能够从失败中成长&#xff0c;不断挑战自我&#xff0c;收获更多更大的失败也是一种体验。 失败是客观事实&#xff0c;坦然是主观上的正能量的情绪。 用客观态度对待客观事实。 …

JavaScript class和继承的原理

&#xff08;对于不屈不挠的人来说&#xff0c;没有失败这回事。——俾斯麦&#xff09; class 相关链接 MDN链接 有关类的详细描述 关于构造函数&#xff0c;原型和原型链的说明 类的概述 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JS 中的类建立在原型上…