multi-repo VS mono-repo

本文介绍了multi-repo和mono-repo两种代码仓库管理风格的优缺点,包括multi-repo的git submodule和mono-repo的lerna。lerna是JavaScript生态下的一站式解决方案,用于管理 mono-repo 中的依赖、版本和工作流。另外还提及了lerna的配置、命令以及使用注意事项,并提出lerna的替代方案NX。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

multi-repo和mono-repo简介

这是两种代码仓库的管理风格:

  • multi-repo:每个项目都用一个git仓库托管。
  • mono-repo:统一用一个git仓库管理所有的项目。

multi-repo

大多数工程其实都是以multi-repo方式管理的
优势:

  • 可以让各项目团队根据需要,定制更适合自己的workflow

不足:

  • 难以对所有项目统一进行操作 (git checkout/npm publish/npm run build..·)
  • 难以追踪依赖关系 (a一b-c)

 mono-repo

广泛应用于一些知名开源项目和硅谷巨头 (React/Angular /Vuetify /Google)
优势:

  • 方便统一地操作各个项目 (git checkout/npm publish/npm run build..·)
  • 利用工具,可以方便地追踪项目间的依赖关系

不足:

  • 代码库随着业务发展会非常巨大
  • 失去了部分的灵活性 (workflow必须统一)
  • 强依赖于mono-repo的管理工具

multi-repo的管理工具 - git submodule

  • git提供的一种管理子仓库的方案
  • 可以批量管理和维护多个git repo
  • 本质上是一个父repo维护了一份各个子repo 的清单
  • 有坑: Git Submodule的坑
  • 替代方案: git subtree
# 初始化git submodules仓库
git submodule init
# 添加一个submodule
git submodule add https://github.com/chaconinc/DbConnector
# 更新所有的submodule
git submodule update
# 查看submodule的状态
git submodule status
# foreach 用于在每个submodule中执行命令
git submodule foreach 'git checkout -b featureA'


mono-repo的管理工具 - lerna

  • 为JS生态下的mono-repo管理提供一站式的解决方案
  • babel/create-react-app /jest /react-router /umi/ nestjs ...
  • 解决了mono-repo下的依赖管理、版本管理、开发提效、工作流 ...

目录结果

  • 整体作为一个Git仓库,也是个npm包(私有)
  • lerna.json是整个mono-repo的配置文件
  • 每个真正的项目,平铺在 packages/中
  • 整个项目可以统一管理所有依赖 (也可以分别管理)

 lerna 常见 命令

Lerna -h                     #help
Lerna add <pkg>[ globs..]    #Add a single dependency to matched packages
lerna bootstrap              #Link local packages together and install remaining package dependencies
lerna changed                #List local packages that have changed since the last tagged release
lerna clean                  #Remove the node_modules directory from all packages
lerna create <name> [loc]    #Create a new lerna-managed package
lerna diff [pkgName]         #Diff all packages or a single package since the last release
lerna exec [cmd] [args..]    #Execute an arbitrary mcommand in each package
lerna init                   #Create a new Lerna repo or upgrade an existing repo to the current version of LernaSymlink 
lerna link                   #together all packages that are dependencies of each other
lerna publish [bump]         #Publish packages in the current project.
lerna run <script>           #Run an npm script in each package that contains that script

lerna 配置

其实只有几个主要字段: version、npm*、command、packages。全部配置见:json schema

  • version:决定fixed mode/independentmode
  • packages:项目的路径
  • npm*:解耦包管理工具 
{
    "version":"1.1.3",
    "npmClient":"npm",
    "npmClientArgs":["--pure-lockfile"],
    "command":{
        "publish":{
            "ignoreChanges": ["ignored-file","*.md"],
            "message":"chore( release): publish",
            "registry":"https://npm.pkg.github.com"
        },
        "bootstrap": {
            "ignore":"component-*",
            "npmClientArgs": ["--no-package-lock"]
         }
    },
    "packages":["packages/*"]
}

lerna 使用的注意事项

  • mono-repo 不可嵌套
  • mono-repo的主仓库必须是私有的 (package.json中设置 private: true )
  • 如果你的仓库对私密性要求非常高,甚至可以不用npm而使用git引用依赖

lerna外的选择 - NX

  • Angular出品
  • 框架强相关,支持:Angular、 React
  • 支持插件机制
  • 远超monorepo管理的强大的功能

文档见:NX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值