企业级包管理器之 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 风格,而是要基于实际工作场景和需求来确定到底采用哪种管理方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLite 数据库学习

0.引言 SQL, 全名是 Structured Query Language, 中文翻译是"结构化查询语言"。它是一种专门用来与数据库交互的语言。简单来说,SQL就是跟数据库"对话"的一种语言。 1.install sudo apt update sudo apt install sqlitebrowser这是一个开源的…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力,其毕业生就业前景及薪资水平均颇为可观。因此,学生应依据个人课程专长来选定专业。若各项课程均表现出色,推荐25届考生优先考虑软件专业,因其上岸难度相对较低。 接下来,C…

智能客户服务:科技赋能下的新体验

在当今这个数字化时代,客户服务已经不仅仅是简单的售后服务,它已竞争的关键要素之一。随着人工智能、大数据、云计算等技术的飞速发展,智能客户服务正逐步改变着传统的服务模式,为企业和消费者带来了前所未有的新体验。 一、智能客…

HCIA-Access V2.5_2_3_网络通信基础_以太网概述

什么是以太网 以太网是由IEEE定义的局域网技术,也是目前应用最普遍的技术,早期的令牌环网,FDDI等局域网技术都被它取代了,以太网主要分为两类,共享型以太网和交换型以太网。共享式以太网主要采用总线型的拓扑结构&…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注:本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远,文章有点“年头”,但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去,我们才能知其然,更知所以然。总结过去…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

【docker】springboot 服务提交至docker

准备docker (不是docker hub或者harbor,就是可以运行docker run的服务),首先确保docker已经安装。 本文以linux下举例说明: systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景,大多对代码的执行的速度,实时性有较高的要求,像嵌入式系统的开发,资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距,会反映在产品的性…

【OJ题解】最长回文子串

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 **题目链接****解题思路****1. 初步判断****2. 回文子串性质****3. 判断是…

若依-帝可得app后端

视频地址 https://www.bilibili.com/video/BV1pf421B71v?t=510.1 APP后端技术栈 架构解析 验证码功能 开发环境使用改的是固定的验证码 12345正式环境使用的是 阿里云的短信方案@Override public void sendSms(String mobile) {// String code = RandomUtil.randomNumbers(5);…

Qt绘制仪表————附带详细说明和代码示例

文章目录 1 效果2 原理3 编码实践3.1 创建仪表属性类3.2 设置类属性3.3 绘制图案3.3.1 设置反走样3.3.2 绘制背景3.3.3 重新定义坐标原点3.3.4 绘制圆环3.3.5 绘制刻度线3.3.6 绘制刻度线上的描述值3.3.7 绘制指针3.3.8 绘制指针数值和单位3.3.9 控制指针变化 扩展福利参考 1 效…

音频客观测评方法PESQ

一、简介 语音质量感知评估(Perceptual Evaluation of Speech Quality)是一系列的标准,包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电…

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三),目前已经完成了基本的功能demo,但是请求接口不可能每个页…

uniapp的多列选择器

1.代码如下 <template><view class"container"><form><picker mode"multiSelector" :range"multiArray" change"onMultiChange" columnchange"onMultiColumnChange"><view class"picker&q…

C# 探险之旅:第三十三节 - 类型class(静态成员和静态类Static Members 和 Static Classes):一场不“动”声色的冒险

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎再次踏上C#的神秘之旅。今天&#xff0c;我们要探索的是一个神秘而又特别的领域——静态成员和静态类。想象一下&#xff0c;这是一群“懒得动”的家伙&#xff0c;他们不喜欢随着对象的创建而四处奔波&#xff0c;更喜欢安安静静…

国威HB1910数字程控电话交换机 generate.php 未授权RCE漏洞复现

0x01 产品简介 国威HB1910数字程控电话交换机是一款功能强大的通信设备,国威HB1910数字程控电话交换机符合国家工信部YD 344-1990《自动用户交换机进网要求》规范,以及其他多项国家安全标准规范,如YD/T 1141-2007、YD/T 729-1994、YD/T 751-1995等。同时,设备还具备自动检…

信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

信奥赛CSP-J复赛集训(bfs专题-刷题题单及题解)(5):洛谷P3395:路障 题目描述 B 君站在一个 n n n\times n n

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

FastJson反序列化学习-01

&#x1f338; FastJson FastJson是一个由阿里巴巴开发的高性能JSON处理库&#xff0c;支持Java对象与JSON字符串之间的互相转换。 本次漏洞研究基于FastJson的1.2.24版本。也就是最早出现FastJson反序列化漏洞的版本。 CVE-2017-18349&#xff0c;FastJson<1.2.24 &…