Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

2024-05-05 01:36

本文主要是介绍Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌟 引言

在软件开发的浩瀚宇宙里,选择合适的代码管理方式是构建高效开发环境的关键一步。今天,我们将深入探讨两大策略——Monorepo(单体仓库)与MultiRepo(多仓库),并通过使用现代化的包管理工具 pnpm,手把手搭建一个功能完善的 Monorepo 仓库。✨

🌱 Monorepo 与 MultiRepo:各显神通

在这里插入图片描述

上图为MultirepoMonorepo对比图,从图中我们可以简要归纳:

  • Multirepo是由多个仓库组成的项目管理方式,每个仓库有着独立的工作流、组件与配置
  • Monorepo则将不同仓库整合成为一个仓库,并共享工作流、组件与配置。

🌲 Monorepo:统一即是力量

Monorepo——想象一座巨大的知识宫殿,每个房间(项目或模块)紧密相连,共享相同的血脉(配置与依赖)。👑

  • 🌈 优点

    • 集中的管理: 🤝 统一的依赖、工具链,简化维护与升级。
    • 代码共享: 🔄 跨项目复用代码,减少重复劳动。
    • 协同作战: 👥 提升团队间的并行开发效率与代码审查质量。
  • 🔥 挑战

    • 仓库膨胀: 📦 随着项目增多,仓库体积可能庞大,影响克隆速度。
    • 权限分层: 🔒 需精细权限控制,防止信息误触。

🌳 MultiRepo:独立自主的花园

MultiRepo——设想一系列精致的花坛,每一处都是独立的世界,拥有自己的气候(配置)与植被(代码)。🌸

  • 🌟 优点

    • 清晰边界: 🛡️ 每个项目界限分明,便于独立管理和部署。
    • 轻便灵活: 💨 小型仓库,克隆快,利于新手上手。
    • 工具自由: 🛠️ 各项目可选最适合的工具链和流程。
  • 🔥 挑战

    • 依赖分歧: 💔 版本不一致,管理复杂度上升。
    • 共享难题: 🔀 共享代码需额外机制,如私有包管理。

选择Monorepo还是MultiRepo,犹如在协作效率与独立灵活性之间寻找平衡点。🎯

总结来说,monorepo倾向于**增强协作和代码一致性,而multirepo则更强调项目独立性和简单性**。选择哪种模式取决于具体团队规模、项目间关联程度、基础设施支持等因素。

在github上我们可以看见无论是element plusAnt design以及vue,以及其他社区开源的项目都是使用的monorepo 方案来管理他们的项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


📊 Monorepo 目录结构概览

一个健康的Monorepo,其目录结构应清晰有序,如下所示:

root
├── .husky       # Git钩子,自动化代码检查
├── node_modules # 依赖存放
├── packages     # 各项目或包的集合
│   ├── proj1    # 项目1
│   ├── proj2    # 项目2
│   └── ...
├── .cz-config.js # 提交信息格式化
├── .gitignore   # Git忽略规则
├── .prettierrc.js # Prettier格式化配置
├── pnpm-workspace.yaml # pnpm工作区配置
└── README.md    # 项目总览

🛠️ 搭建 Monorepo

🚀 pnpm-原生支持Workspaces

选用pnpm作为Monorepo项目中的包管理器主要有以下几个理由:

🎯 硬链接与缓存机制

  • pnpm使用硬链接和符号链接(软链接)来避免在磁盘上重复存储同一依赖的不同副本,显著减少存储空间占用。
  • 它还引入了内容寻址存储(CAS)的概念,只存储唯一的内容块,从而优化了存储和下载效率。

🎯 更快的速度与更低的磁盘占用

  • 由于依赖的共享和链接机制,安装和更新依赖时的速度更快,尤其是对于包含大量重复依赖的Monorepo项目,优势更加明显。
  • 即使在大型项目中,也能保持良好的性能和较低的磁盘占用。

🎯 原生支持Workspace

  • pnpm natively支持Workspaces(类似于yarn workspaces),只需简单的配置就可以轻松管理多个包或项目,这些项目可以在一个仓库中共享依赖。

🎯 扁平化依赖结构

  • pnpm保证了依赖树的扁平化,但同时也保持了依赖包之间的隔离,降低了版本冲突的可能性。

🎯 简洁的CLI工具

  • pnpm提供的 CLI 工具对于Monorepo的日常管理任务(如安装、更新、清理依赖)十分友好,可以直接在多个项目中执行命令。

🎯 生态系统兼容性

  • pnpmnpm生态系统的兼容性很高,能够无缝对接大部分支持npm/yarn的工具和流程。

因此,在构建和维护Monorepo时,pnpm凭借其高效的空间利用、快速的依赖管理以及对多项目工作区的良好支持,成为了一个理想的选择。尤其在需要频繁交互和更新多个项目共享依赖的场景下,pnpm的优势尤为突出。

🔥 Monorepo中pnpm常用命令

  • 安装/添加依赖

    # 在所有工作区内安装全局依赖
    pnpm add <dependency> -w# 在单个工作区内安装依赖
    pnpm add <dependency> -w <workspace-name># 安装本地工作区间的依赖
    pnpm add <workspace-package>@workspace:<workspace-name>
    
  • 更新依赖

    # 更新所有工作区的依赖
    pnpm update -w# 更新单个工作区的依赖
    pnpm update -w <workspace-name>
    
  • 清理无用依赖

    # 移除未在package.json中声明的依赖
    pnpm prune -w# 清理缓存
    pnpm cache clean
    
  • 列出工作区依赖

    # 显示所有工作区及其依赖关系
    pnpm list -a# 显示单个工作区的依赖树
    pnpm list -w <workspace-name>
    

🔩 创建Monorepo

  • 初始化

    pnpm init
    
  • 修改package.json的信息

    {"name": "仓库名称","version": "1.0.0","description": "","...": "..."
    }
    
  • 根目录新建packages目录

    mkdir packages
    
  • 新建pnpm-workspace.yaml文件

    touch pnpm-workspace.yaml
    
  • 声明对应的工作区

    # pnpm-workspace.yaml
    packages:# 存放所有项目的目录- 'project/*'# 存放组件的目录- 'components/*'# 组件库使用的示例代码- 'examples/*'# 存放文档- 'docs/**'# 存放公共库(配置文件、工具函数、模版等)- 'shared/**'
    
  • packages目录创建相应的工作区目录以及示例项目

    # 进入`packages`目录
    cd packages
    # 新建`project`工作区
    mkdir project
    # 新建`components`工作区
    mkdir components
    # 新建`examples`工作区
    pnpm create vite examples
    # ...
    
  • 将所有项目用到的共同依赖的dependenciesdevDependencies添加到根目录的package.json中,并在根目录下载依赖到仓库全局锁定,后面创建的项目将沿用这套依赖

    pnpm install -w
    

到此,monorepo已经准备就绪,接下来就可以进行仓库的eslintprettiercommitlinthusky等代码规范以及提交规范的配置了。


🎯 总结

Monorepo策略通过pnpm的高效管理,实现了代码库的集中与共享,极大提升了大型项目或团队的协同效率。从目录结构规划到依赖管理,每一步都旨在构建一个既强大又灵活的开发环境。无论你是初创项目还是成熟团队,掌握Monorepo的构建与管理,都将是你软件开发之旅的强大助力。🚀


🔐 相关链接

  • pnpm的安装与配置: pnpm的安装与配置(Windows/macOS)

这篇关于Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960540

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识