企业级包管理器之 monorepomultirepo (8)

在企业级项目开发中,面对多个项目的管理,monorepo 和 multirepo 是两种常见的代码管理方案,它们各有特点与优劣,下面我们来详细了解一下。

一、基本概念

  1. monorepo:“mono”在英语中有“单一的、单独的”之意,“repo”是“repository”(仓库)的简写,所以 monorepo 指的就是使用单一仓库来管理多个项目。那什么算是一个仓库呢?一般来讲,一个仓库是指通过版本控制系统(git)进行管理的代码库。在 git 的语境下,一个仓库通常是指一个包含“.git”子目录的目录,“.git”这个目录包含了所有版本的提交历史、分支以及标签等信息,也就是说,一个通过 git 初始化后的目录才算得上是一个仓库。
  2. multirepo(polyrepo):与 monorepo 相对应,multirepo 指的是使用多个仓库管理多个项目,通常是一个项目对应一个仓库。
    在这里插入图片描述

二、monorepo

  1. 产生背景与应用现状:monorepo 这种多项目管理方式乍看似乎违背直觉,毕竟我们习惯认为多个项目就该对应多个仓库。但随着公司业务发展,类似项目增多,一个项目对应一个仓库会暴露出不少弊端。比如,每个项目都要搭建eslint + prettier + commitLint + styleLint等代码规范校验;每个项目都要搭建许多常用组件并创建公共 utils 函数;各个项目的主要依赖库(如 vue、elementPlus)版本可能不一致,且存在重复安装;有时候组件改动会涉及多个项目都要手动更改等情况。

鉴于在不同项目业务中,常常会用到公共的组件库以及公共依赖,采用 monorepo 风格管理多个项目就较为合适了。它能让多个模块共享同一个仓库,进而共享同一套构建流程、代码规范等,在存在公共组件或工具函数时,查看代码、修改 bug、调试等操作都会变得很便捷。

目前,很多知名公司都采用 monorepo 风格管理内部多个项目,例如:

  • 谷歌(Google):将所有项目和库存储在一个称为 Piper 的庞大代码库中,便于管理依赖关系、共享代码以及跨项目进行更改。
  • Meta:其代码库涵盖多个项目,像 React、React Native 和 Jest 等,通过 monorepo 策略统一管理这些项目的代码和依赖关系。
  • 微软(Microsoft):部分项目采用了 monorepo,如 Windows 操作系统和 Visual Studio 代码编辑器,以此来管理相关代码。
  • Twitter:将所有代码存储在名为 Pants 的代码库中,有助于更好地管理依赖关系并提高代码复用率。
  • Uber:使用名为“Fusion.js”的 monorepo 代码库管理众多前端项目,能更有效地共享代码并进行跨项目更改。
  1. monorepo 的优势
  • 代码共享:这是 monorepo 的主要优势之一,方便项目间共享代码,提高复用率,降低维护成本。
  • 统一的依赖管理:所有项目和库的依赖关系都在同一个地方进行管理,有助于减少版本冲突和依赖问题,团队能更轻松地保持依赖关系的一致性并进行更新。
  • 简化代码共享:由于所有项目处于同一个代码库,开发人员能便捷地共享代码和资源。
  • 更容易进行跨项目更改:对多个项目进行协调更改变得简单,因为它们都在同一个地方,降低了跨项目更改的复杂性和风险。
  • 更好的跨团队协作:开发人员可以轻松查看其他项目的代码和进度,有助于提高团队之间的协作效率。

在企业开发中,如果你选择使用 monorepo 风格来管理你的多个项目,那么通常是将公共的组件、工具库、api 进行一个抽离共享。

  1. monorepo 的缺点
  • 代码库的规模:随着项目数量增加,代码库会变得十分庞大,管理难度上升。
  • 缺乏独立版本的控制:所有项目共享相同的提交历史,这可能导致独立版本的控制变得极为复杂。
  • 权限和安全性问题:所有项目都在同一个代码库内,权限控制难度加大,安全性相对变弱。
  • 工具和基础设施的要求:项目增多、代码库变大时,需要特定工具和基础设施辅助管理,像谷歌就采用自定义的代码库及构建系统来管理庞大的 monorepo。
  1. 适用场景建议
  • 当项目之间有很多共享代码和资源时,monorepo 能使代码共享更简单,提高代码复用率,比较适用。
  • 当团队需要频繁进行跨项目协作时,尤其是涉及跨项目更改的情况,monorepo 有助于提高协作效率,可优先考虑。
  • 当统一依赖管理对项目至关重要时,monorepo 能提供更好的依赖管理解决方案,适合采用这种管理风格。

三、multirepo

  1. 特点与优势:理解了 monorepo 的概念后,multirepo 就比较好理解了,即不同项目对应独立的仓库。在这种模式下,每个项目和库都有自己的版本控制历史和依赖关系,具备以下优势:
  • 独立版本控制:每个项目和库可独立跟踪版本控制历史,使版本控制更加清晰。
  • 更小的代码库规模:每个项目都有自己的代码库,相对来说规模较小,便于管理和克隆操作。
  • 更高的项目自治:每个项目和库能依据自身需求选择技术栈和依赖管理策略,项目灵活性更高。
  1. 缺点:multirepo 的缺点在于代码共享会变得困难一些,不同项目间难以便捷地复用代码。

四、monorepo 与 multirepo 的对比

下面通过一张表格来对比两个多项目代码管理风格的区别:

monorepomultirepo
开发只需要在一个仓库中开发,编码方便,新成员入门简单仓库体积小,模块划分清晰。
复用代码复用高,方便进行代码重构需要多仓库来回切换,无法实现跨项目代码复用
工程配置所有项目统一使用相同的工程配置各个项目可能有一套单独标准
依赖管理共同依赖可以提升到 root,版本控制更加容易,依赖管理会变得更方便不同的项目会安装相同的依赖,但即便相同的依赖会存在版本不同的情况
代码管理代码全在一个仓库,项目太大用 git 管理会存在问题,无法隔离项目代码权限各个团队可以控制代码权限,也几乎不会有项目太大的问题
部署lerna 工具支持如果多项目存在依赖关系,开发就需要在不同的仓库按照依赖先后顺序去修改版本以及进行部署

总之,在考虑管理多个项目时,不能盲目选用 monorepo 风格,而是要基于实际工作场景和需求来确定到底采用哪种管理方式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【electron】electron forge + vite + vue + electron-release-server 自动更新客户端

基本信息 electron forge vue页面(中文):https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面(英文,中文版下面的tab无法点击):https://www.electronfor…

后端-带有多个动态查询条件的分页查询

page和pagesize是分页插件所带的参数,其他三个是模糊查询的条件字段 因为是路径动态?拼接 的形式,所以不需要注解requestbody,先封装到pageresult中,再把pageresult封装到result中。 后端给前端的返回值封装到Vo中

【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习 **集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。 使用于组合的算法是弱学习算法,即分类正确率仅比随机猜测略高的学习算法,但是组合之后的效果仍可能高于…

Java常用 Date 时间格式化、Calender日历、正则表达式的用法

目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…

jdk1.8安装及环境配置(最新最详细教学!!!)

jdk1.8安装: 看了网上很多关于jdk1.8的安装,我觉得有时候会让人云里雾里,虽然自己可能配置成功,不过没有一套自己的思路,我结合自己的经验来说一下。 jdk在windows有两种安装方式,一种是解压缩包&#xf…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…

httpsok-v1.18.0-SSL证书自动续期

🔥httpsok-v1.18.0-SSL证书自动续期 介绍 httpsok 是一个便捷的 HTTPS 证书自动续期工具,基于全新的设计理念,专为 Nginx 、OpenResty、Apache 等服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分…

Dynamics 365 CRM- 后端

Dynamics 365 CRM 后端插件语法示例 public IPluginExecutionContext context null;//上下文 public IOrganizationServiceFactory serviceFactory null;//组织服务工厂对象 public IOrganizationService service null;//Org服务对象//创建执行上下文 context (IPluginExe…

Linux驱动开发(12):中断子系统–按键中断实验

本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana,并且dashboard接入数据 大屏编号地址:Node Exporter Full | Grafana Labs 创建企微机器人 备注:群里若有第三方外部人员不能创建 机器人创建完成,记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…

[WiFi] WiFi安全加密WEP Vs WPA Vs WPA2 Vs WPA3整理

WiFi安全标准时间线 WEP(Wired Equivalent Privacy) WEP最早于1997年推出,是为了保护无线网络上的数据通信而设计的。当时,Wi-Fi技术还处于起步阶段,人们开始意识到需要一种安全协议来防止未经授权的访问和窃听。WEP被…

使用Keil V6编译 FreeRTOS CMSIS V2版本 ETH + Lwip 编译报错问题解决方式

网上其他人写的都解决不了,要不用的是CMSIS V1版本,根据他们的方式搞完还是报错,今天花点时间自己搞一下。 不想自己动手?没问题,模版已上传Gitee https://gitee.com/maybe_404/stm32-f4xx_-free-rtos_-lwip_-templa…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件,代码如下: // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

大模型闯关学习——L1G6000 OpenCompass 评测书生大模型实践

任务要求: 基础任务: 首先创建开发机 进入开发机: 创建测评所需要的环境 conda create -n opencompass python3.10 conda activate opencompass cd /root git clone -b 0.3.3 https://github.com/open-compass/opencompass cd opencompas…

C# 探险之旅:第三十节 - 类型class(继承Inheritance) —— 当“儿子”继承“老爸”的遗产

嘿,探险家们!欢迎再次踏上我们的C#奇幻旅程。今天,我们要聊一个既有趣又实用的话题——继承(Inheritance)!想象一下,如果你的“儿子”能够继承“老爸”的遗产,那编程世界里的对象们也…

排序算法(2)——快速排序

目录 1. 实现方式 1.1 霍尔法 ​ 1.2 挖坑法 1.3 前后指针法 2. 复杂度分析 3. 快速排序优化 3.1 三数取中 3.2 小区间使用插入排序 3.3 非递归实现 快速排序是英国计算机科学家托尼・霍尔(C. A. R. Hoare)在 1960 年年提出的一种二叉树结构的交…

【python】最新版抖音js逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

apollo2.0.0本地调试运行

一、下载源码 https://github.com/apolloconfig/apollo/tree/v2.0.0 二、本地环境 jdk 1.8 mysql 5.7 maven 3.6.3 三、IDEA运行源码 IDEA直接Open打开项目即可 需要依次启动configservice、adminservice、portal三个服务 基于apollo-assembly模块的ApolloApplication…

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 文档介绍了Edify 3D,一种为高质量的3D资产生成而设计的高级解决方案。首先在多个视点上合成了所描述对象的RGB和表面法线图像正在使用扩散模型。然后使用多视图…