Open cjfff opened 5 years ago
lerna
lerna 是 babel 自研的一套基于 monorepo(独立的代码仓库) 的包管理工具。 将大型软件分成一个个独立的包对于代码共享非常有帮助。但是跨存储库进行更改非常麻烦并且难以跟踪,尤其是调试的适合。为了解决这些问题。一些项目会将其代码组织为多包存储库 monorepo。像 Babel, React, Vue-next, Angular, Ember等。
babel
monorepo
Babel
React
Vue-next
Angular
Ember
monolithic repository
multirepo
multirepo 即为传统的做法,按 module (模块) 划分多个仓库,在实践中你会发现一些问题。
module
monorepo 把所有相关的模块都放到一个仓库中。每个模块独立发布,但使用与仓库统一的版本号(例如 Babel, React), issue 和 pr 都集中在一个仓库里。changelog 可以从 commit 列表中梳理出来,甚至可以按照 commit 规范自动关联 issue tag, 自动生成 changelog.
上面说的都是好处,下面说说坏处。
Multirepo
bug
首先安装管理工具 npm install lerna -g
npm install lerna -g
然后创建 demo 文件夹
mkdir my-monorepo && cd my-monorepo && lerna init
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
在 usage 中的 package.json 写入依赖
{ "dependencies": { "alpha": "1.0.0", "beta": "1.0.0" } }
执行 lerna bootstrap
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 下会帮我们把本地依赖给链接进去。解决了本地调试的问题。
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
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)
什么是
lerna
?lerna
是babel
自研的一套基于monorepo
(独立的代码仓库) 的包管理工具。 将大型软件分成一个个独立的包对于代码共享非常有帮助。但是跨存储库进行更改非常麻烦并且难以跟踪,尤其是调试的适合。为了解决这些问题。一些项目会将其代码组织为多包存储库monorepo
。像Babel
,React
,Vue-next
,Angular
,Ember
等。monorepo
全称为monolithic repository
(单独的代码仓库),与之相对的有multirepo
(传统的多代码仓库)。multirepo && monorep 比较
multirepo
即为传统的做法,按module
(模块) 划分多个仓库,在实践中你会发现一些问题。monorepo
把所有相关的模块都放到一个仓库中。每个模块独立发布,但使用与仓库统一的版本号(例如Babel
,React
), issue 和 pr 都集中在一个仓库里。changelog 可以从 commit 列表中梳理出来,甚至可以按照 commit 规范自动关联 issue tag, 自动生成 changelog.上面说的都是好处,下面说说坏处。
monorepo 的优势
Multirepo
结构项目bug
修正流程lerna
monorepo
bug
修正流程实践
首先安装管理工具
npm install lerna -g
然后创建 demo 文件夹
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)
在 usage 中的 package.json 写入依赖
执行
lerna bootstrap
此时项目目录变为这样, 可以看到
node_modules
下会帮我们把本地依赖给链接进去。解决了本地调试的问题。目录结构如下
输出 alpha beta