将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很麻烦并且难以跟踪,并且,跨越多个代码仓库的测试将迅速变得非常复杂。
为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。但是,例如 Babel、 React、Angular、Ember、Meteor、Jest 等项目以及许多其他项目则是在 一个代码仓库中包含了多个软件包(package)并进行开发。
Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化。
开始
全局安装 lerna
1 | $ npm install lerna -g |
初始化 lerna 项目
1 | $ lerna init --independent |
你的代码仓库目前应该是如下结构:
1 | lerna-repo/ |
创建 package
1 | $ lerna create module-1 |
yarn workspaces & Lerna Hoisting
使用 yarn workspaces 结合 Lerna useWorkspaces
可以实现 Lerna Hoisting。这并不是多此一举,这可以让你在统一的地方(根目录)管理依赖,这即节省时间又节省空间。
配置 lerna.json:
1 | { |
顶级 package.json 必须包含一个 workspaces 数组:
1 | { |
npm registry
搭建 verdaccio
verdaccio 是一个开源轻量的 npm 私服
全局安装:
1 | $ npm install verdaccio -g |
配置 ~/.config/verdaccio/config.yaml
uplinks:
1 |
|
设置开机自启动
0、run sudo npm i -g pm2
1、run pm2 start verdaccio
& pm2 startup
outputs:
1 | [PM2] Init System found: launchd |
2、run sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup launchd -u luozhu --hp /Users/luozhu
outputs:
1 | [PM2] Freeze a process list on reboot via: |
修改 lerna publishConfig
1 | // lerna.json |
注意:如果子包是带
scope
的,需要为子包设置publishConfig.access
commitlint & commitizen
请参考我之前的文章 一文搞定规范化 Git Commit
开发流程
install
1 | $ yarn install |
package 依赖
给指定 package 安装依赖:
1 | # 或者(推荐) |
给所有 package 安装依赖:
1 | $ lerna add lodash |
workspace 之间的依赖
1 | $ lerna add module-2 --scope module-1 |
共用的工具依赖
1 | $ yarn add -WD typescript |
lerna.json
- version: 当前仓库的版本,Independent mode 请设置为
independent
- npmClient: 指定运行命令的客户端程序(默认是 npm)
- ignoreChanges: 一个不包含在
lerna changed/publish
的 glob 数组。使用这个去阻止发布不必要的更新,比如修复README.md
- command
- publish
- registry:设置自定义的 npm 代理(比如使用 verdaccio 搭建的私服)
- conventionalCommits:
lerna version
会自动决定 version bump 和生成 CHANGELOG 文件 - message:一个 publish 时的自定义 commit 信息。详情请查看@lerna/version
- publish
npm scripts
1 | { |