项目代码管理的方式

通常我们在项目不断的迭代更新中,代码体积会越来越大,我们会更具具体的业务或者功能或者某些方便复用的代码去拆分成独立的模块

multirepo

multirepo的方式就是把这种独立module分别放到不同的repository中去进行管理,即按模块划分为多个库。

优点

可以让每个module拥有自己的repository,按照自己的风格,工具和工作流程去开发维护module。

缺点

举个例子,现在需要维护两个package,分别是module-a和module-b,其中module-a依赖与module-b,开发module-a的过程中发现module-b有bug需要去修复,那么处理流程可能是这样:

  1. 切换到module-b项目并修改bug和版本号,发布
  2. 切换回module-a项目拉取最新的依赖
    这是只有两个package的情况,当package数量变多时可以想象其维护成本有多大,并且在不同的仓库中间你熟悉处理不同的代码和工具,维护成本较高。后期如果涉及人员交接,可能就会陷入到不知道哪里去找 repository 的境地。

monorepo

与multirepo相反monorepo是把所有相关的module放在一个repository里统一管理

优点

  1. 统一的工作流
  2. 统一的仓库
  3. 方便管理版本和依赖
  4. 跨项目的操作和修改更容易

缺点

  1. 代码体积巨大
  2. 需要依赖强大的代码管理工具

什么是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-moduletest-module-utils,并且到各自目录中执行:

npm init -y

修改test-modulepackage.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版本升级一个已存在的库

  1. 在 package.json文件的devDependencies字段里增加 lerna
  2. 生成lerna.json配置文件来存储版本号

如果带上可选参数 --independent/-i lerna将使用independent模式

Lerna 提供两类管理项目的模式: Fixed 和 Independent.

  1. Fixed(default)模式下,项目通过单一的版本进行控制。版本号放在项目根目录下的lerna.json文件的version这个字段。当你执行 lerna publish,如果有文件更新,它将发布新的版本
  2. Independent模式下,项目里的各个package独立维护自己的version,它将会忽略lerna.json中定义的version
lerna bootstrap

引导目前Lerna库的所有package,安装它们各自的依赖关系并连接任何相互交叉依赖的关系

  1. 为每个package npm install 安装dependencies
  2. 为packages 中存在相互依赖的做软链处理
  3. 为每个package执行其中的 npm prepublish 命令
lerna run 
                    
                    

你可能感兴趣的:(项目代码管理的方式)