通常我们在项目不断的迭代更新中,代码体积会越来越大,我们会更具具体的业务或者功能或者某些方便复用的代码去拆分成独立的模块
multirepo
multirepo的方式就是把这种独立module分别放到不同的repository中去进行管理,即按模块划分为多个库。
优点
可以让每个module拥有自己的repository,按照自己的风格,工具和工作流程去开发维护module。
缺点
举个例子,现在需要维护两个package,分别是module-a和module-b,其中module-a依赖与module-b,开发module-a的过程中发现module-b有bug需要去修复,那么处理流程可能是这样:
- 切换到module-b项目并修改bug和版本号,发布
- 切换回module-a项目拉取最新的依赖
这是只有两个package的情况,当package数量变多时可以想象其维护成本有多大,并且在不同的仓库中间你熟悉处理不同的代码和工具,维护成本较高。后期如果涉及人员交接,可能就会陷入到不知道哪里去找 repository 的境地。
monorepo
与multirepo相反monorepo是把所有相关的module放在一个repository里统一管理
优点
- 统一的工作流
- 统一的仓库
- 方便管理版本和依赖
- 跨项目的操作和修改更容易
缺点
- 代码体积巨大
- 需要依赖强大的代码管理工具
什么是lerna
引用官网的介绍:一个JavaScript多模块的管理工具。
A tool for managing JavaScript projects with multiple packages
使用lerna可以更好的帮助我们维护monorepo
lerna基本使用
step1
安装全局依赖包
npm install -g lerna
step2
初始化lerna项目
git init lerna-demo
cd lerna-demo
lerna init
初始化完成后目录结构如下
│ lerna.json
│ package.json
|
└─packages
step3
新建两个测试package:test-module
和test-module-utils
,并且到各自目录中执行:
npm init -y
修改test-module
的package.json
并添加对test-module-utils
的依赖
"dependencies": {
"test-module-utils": "^1.0.0"
}
step4
回到主目录lerna-demo
执行:
lerna bootstrap
leran
会依次遍历package去安装依赖并且通过软链关联交叉依赖(test-module
依赖test-module-utils
),得到的目录如下:
│ lerna.json
│ package.json
│
└─packages
├─test-module
│ │ package.json
│ │
│ └─node_modules
│ └─test-module-utils
│ package.json
│
└─test-module-utils
package.json
lerna 常用命令
lerna init [--independent/-i]
创建一个Lerna库或用现在的Lerna版本升级一个已存在的库
- 在 package.json文件的devDependencies字段里增加 lerna
- 生成lerna.json配置文件来存储版本号
如果带上可选参数
--independent/-i
lerna将使用independent模式
Lerna 提供两类管理项目的模式: Fixed 和 Independent.
- Fixed(default)模式下,项目通过单一的版本进行控制。版本号放在项目根目录下的lerna.json文件的version这个字段。当你执行 lerna publish,如果有文件更新,它将发布新的版本
- Independent模式下,项目里的各个package独立维护自己的version,它将会忽略lerna.json中定义的version
lerna bootstrap
引导目前Lerna库的所有package,安装它们各自的依赖关系并连接任何相互交叉依赖的关系
- 为每个package npm install 安装dependencies
- 为packages 中存在相互依赖的做软链处理
- 为每个package执行其中的 npm prepublish 命令
lerna run