cjfff / issue-blog

博客已经迁移至语雀
https://www.yuque.com/ubdme4/ccc
0 stars 0 forks source link

lerna 单仓库管理 #18

Open cjfff opened 5 years ago

cjfff commented 5 years ago

什么是 lerna ?

lernababel 自研的一套基于 monorepo(独立的代码仓库) 的包管理工具。 将大型软件分成一个个独立的包对于代码共享非常有帮助。但是跨存储库进行更改非常麻烦并且难以跟踪,尤其是调试的适合。为了解决这些问题。一些项目会将其代码组织为多包存储库 monorepo。像 Babel, React, Vue-next, Angular, Ember等。

multirepo && monorep 比较

multirepo 即为传统的做法,按 module (模块) 划分多个仓库,在实践中你会发现一些问题。

  1. changelog 难以整合,需要人工梳理变动仓库,并做整合。
  2. 子项目过多,仓库又分散的情况下,仓库不好找。
  3. 版本管理的日常开销过大。
  4. 如果 module 之间相互依赖后,调试也相当困难

monorepo 把所有相关的模块都放到一个仓库中。每个模块独立发布,但使用与仓库统一的版本号(例如 Babel, React), issue 和 pr 都集中在一个仓库里。changelog 可以从 commit 列表中梳理出来,甚至可以按照 commit 规范自动关联 issue tag, 自动生成 changelog.

上面说的都是好处,下面说说坏处。

  1. repo 体积变大。
  2. 统一构建工具,需要对构建工具的要求更高。
  3. 调试需要额外的配置(例如修改后动态编译)。

monorepo 的优势

实践

  1. 首先安装管理工具 npm install lerna -g

  2. 然后创建 demo 文件夹

mkdir my-monorepo && cd my-monorepo && lerna init
  1. 创建示例文件
    
    cd packages
    mkdir alpha
    cd alpha
    npm init -y
    echo "module.exports = 'alpha'" > index.js

cd .. cd beta npm init -y echo "module.exports = 'beta'" > index.js

mkdir usage cd usage npm init -y touch index.js

index.js 中写入内容

var alpha = require('alpha') var beta = require('beta') console.log(alpha + " " + beta)


此时我们可以看到项目结构如下

```js
my-monorepo
├─ lerna.json
├─ package.json
└─ packages
       ├─ alpha
       │    ├─ index.js
       │    └─ package.json
       ├─ beta
       │    ├─ index.js
       │    ├─ package.json
       │    └─ usage
       └─ usage
              ├─ index.js
              └─ package.json
  1. 在 usage 中的 package.json 写入依赖

    {
    "dependencies": {
    "alpha": "1.0.0",
    "beta": "1.0.0"  
    }
    }
  2. 执行 lerna bootstrap

    lerna notice cli v3.17.0
    lerna info Bootstrapping 3 packages
    lerna info Symlinking packages and binaries
    lerna success Bootstrapped 3 packages

此时项目目录变为这样, 可以看到 node_modules 下会帮我们把本地依赖给链接进去。解决了本地调试的问题。

目录结构如下

my-monorepo
├─ lerna.json
├─ package.json
└─ packages
       ├─ alpha
       │    ├─ index.js
       │    └─ package.json
       ├─ beta
       │    ├─ index.js
       │    ├─ package.json
       └─ usage
              ├─ index.js
              ├─ node_modules
              │    ├─ alpha
              │    └─ beta
              └─ package.json
  1. 验证结果
    
    node .\packages\usage\index.js

输出 alpha beta



## 总结
1. 这里我们回顾了传统的多模块项目以及单代码仓库的优缺点。是否使用主要是看具体情况项目而言,像很多个子模块,子模块之间又会需要相互依赖的情况还是推荐使用 `monorepo` 方案的。
2. [lerna](https://github.com/lerna/lerna) 的基本使用方式

## 参考链接
- http://www.ayqy.net/blog/lerna%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/
- https://github.com/reggi/lerna-tutorial
- https://cloud.tencent.com/developer/article/1467217

## 附录
- [demo 仓库地址](https://github.com/cjfff/lerna-demo)