单一仓库与多仓库架构
单一仓库(Monorepo)架构是一种策略,它允许我们在一个单一的仓库中管理多个项目或包;而多仓库(Multirepo)架构则是将每个项目分别存放在不同的仓库中。
在Monorepo结构中,除了根目录下有一个公共的package.json
文件外,每个子项目(sub-package)也有自己的package.json
文件。
子项目之间可以通过在package.json
中定义的name
属性相互引用,从而保持各自的独立性。
# 单一仓库目录结构示例
monorepo-demo
├── packages
│ ├── module-a
│ │ ├── src # 模块A的源代码
│ │ ├── node_modules # 模块A的依赖库
│ │ └── package.json # 模块A的依赖配置
│ └── module-b
│ ├── src # 模块B的源代码
│ └── package.json # 模块B的依赖配置
├── .eslintrc # 整个项目的配置文件
├── node_modules # 所有子项目的公共依赖库
└── package.json # 所有子项目的公共依赖配置
相比之下,Multirepo架构倾向于将每个项目隔离在不同的仓库中,每个项目都有自己的package.json
文件来管理依赖。
# 多仓库项目A目录结构
multirepo-a
├── src
├── .eslintrc
├── node_modules
└── package.json
# 多仓库项目B目录结构
multirepo-b
├── src
├── .eslintrc
├── node_modules
└── package.json
单一仓库工具
在采用单一仓库架构的软件开发中,选择合适的工具对于管理大规模代码库、提升团队协作效率以及优化构建和部署流程至关重要。
截至2024年,前端领域中流行的Monorepo工具包括Pnpm Workspaces
、Yarn Workspaces
、npm Workspaces
、Rush
、Turborepo
、Lerna
、Yalc
和Nx
。
强烈推荐使用Pnpm Workspaces
作为单一仓库项目的依赖管理工具。
那么,单一仓库与包管理工具(npm、yarn、pnpm)之间的关系是怎样的呢?
这些包管理工具能够为单一仓库提供依赖安装和依赖管理的支持。通过它们对workspace的支持,允许在单一仓库中的不同子项目之间共享依赖项,并提供一种管理这些共享依赖项的方法。这可以简化依赖项管理和构建过程,并提高开发效率。
单一仓库项目搭建
背景
传统的多仓库模式通常意味着每个项目都需要一个独立的仓库。例如,如果你有三个项目,就需要创建三个远程仓库,并且需要为每个项目单独安装和升级依赖。
而单一仓库模式则是在一个仓库中管理多个项目,这些项目可以是独立的,也可以相互依赖。通过这种方式,多个项目可以共享依赖。例如,如果多个项目都需要lodash
,那么只需要安装一次即可。
pnpm i lodash -w
当然,在单一仓库中,除了公共的package.json
依赖外,每个子项目也会有自己的私有package.json
依赖。
我们选择Pnpm Workspaces
作为单一仓库项目的依赖管理工具,接下来一起搭建一个单一仓库项目。
安装包管理工具
全局安装pnpm。
npm i pnpm -g
初始化项目
创建一个新的项目目录pnpm-monorepo
,在根目录运行pnpm init
创建package.json
文件。
然后在根目录新建一个packages
文件夹,用于存储子项目。
新建packages/libc-shared
(共享包),用于存放多个项目或组件之间共享的代码。运行pnpm init
创建package.json
文件,将package.json
的name
字段修改为"@libc/shared"
;将package.json
的main
入口文件路径字段修改为"src/index.js"
。
{
"name": "@libc/shared",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
}
新建packages/libc-ui
(公共组件包),即UI组件库,这里我们直接克隆了iview-ui-plus代码。运行pnpm install
安装依赖,**将package.json
的name
字段
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4308.html