一、lerna是什么?
Lerna 是一个用来优化托管在git\npm上的多package代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。目前babel、react都使用了lerna的多包管理。
二、使用场景
在日常业务中,开发UI组件库、Util工具库以及插件库等场景
通常,我们在开发前端项目时都是单个包的,也就是只有一个package.json文件以及一个node_modules文件夹。单个包项目的优点不言而喻,简单,可靠,便于管理
但是,当一个大的项目库代码量剧增之后,管理起来就是一件比较麻烦的事情,为了方便代码的共享,就需要将代码库拆分成独立的包
当管理多个npm包时, 通常会遇到以下问题:
package之间相互依赖,开发人员需要在本地手动执行npm link,手动维护版本号的更替
发布繁琐, 多个package之间可能存在相互依赖, 多工程切换, 更新版本号
每一个package都包含独立的node_modules,而且大部分都包含babel,webpack等开发时依赖,安装耗时冗余并且占用过多空间
总结下,有几点优势:
- 自动解决packages之间的依赖关系
- 通过
git检测文件改动,自动发布 - 根据
git提交记录,自动生成CHANGELOG - issue的集中管理,解决多包库的issue混乱痛点
缺点:
1. 当源码足够大的时候,repo体积较大;
2. 统一构建工具,对构建工具提出了更高要求,要能构建各种相关module
3. 代码集中管理,对多人协同工作要求更高
三、工作模式
Fixed/Locked mode (default)
Independent mode
四、如何快速开始
# 全局安装lerna
$ npm install lerna -g
# 默认初始化lerna框架
$ lerna init
# 在packages下创建文件夹daybyday
$ cd packages
$ mkdir daybyday
# 进入文件夹初始包
$ cd daybyday
$ yarn init
# 或者采用lerna指令创建文件夹并初始化
# lerna create [loc]
$ lerna create gpnote PS G:\lerna\lerna-demo> tree /f
G:.
│ lerna.json
│ package.json
│
└─packages
└─daybyday
package.json五、git配置
# 推送代码到远程库
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:fisher-zwl/lerna-demo.git
git push -u origin master六、yarn的workspaces模式
- 修改顶层package.json lerna.json
# package.json 文件加入
"private": true,
"workspaces": [
"packages/*"
],
# lerna.json 文件加入
"useWorkspaces": true,
"npmClient": "yarn",七、指令详解
lerna create [loc]
# 根目录的package.json
"workspaces": [
"packages/*",
"packages/@gp0320/*"
],
# 创建一个包gpnote默认放在 workspaces[0]所指位置
lerna create gpnote
# 创建一个包gpnote指定放在 packages/@gp0320文件夹下,
# 注意必须在workspaces先写入packages/@gp0320,看上面
lerna create gp packages/@gp03202. lerna add [@version] [--dev] [--exact]
- --dev devDependencies 替代 dependencies
- --exact 安装准确版本,就是安装的包版本前面不带^, Eg: "^2.20.0" ➜ "2.20.0"
# Adds the module-1 package to the packages in the 'prefix-' prefixed folders lerna add module-1 packages/prefix-* # Install module-1 to module-2 lerna add module-1 --scope=module-2 # Install module-1 to module-2 in devDependencies lerna add module-1 --scope=module-2 --dev # Install module-1 in all modules except module-1 lerna add module-1 # Install babel-core in all modules lerna add babel-core
3. lerna bootstrap
4. lerna list
列出所有的包,如果与你文夹里面的不符,进入那个包运行yarn init -y解决
PS G:\lerna\lerna-demo> lerna list
lerna notice cli v3.21.0
daybyday
react-image-preview
lerna success found 2 packages5. lerna clean
删除所有包的node_modules目录
6. lerna changed
列出下次发版lerna publish 要更新的包。
原理:
需要先git add,git commit 提交。
然后内部会运行git diff --name-only v版本号 ,搜集改动的包,就是下次要发布的。 并不是所有包都是同一个版全发布。
PS G:\lerna\lerna-demo> lerna changed
lerna notice cli v3.21.0
lerna info Assuming all packages changed
daybyday
react-image-preview
lerna success found 2 packages ready to publish
# 俩个改过的包,下次发布publish将发布这俩个7. lerna publish
特点:会打tag,上传git,上传npm。
- 如果你的包名是带scope的例如:"name": "@gp0320/gpwebpack",那需要在packages.json添加
"publishConfig": {
"access": "public"
},8. lerna import
9. lerna run
运行某个包的某个指令
lerna run < script > -- [..args] # 运行所有包里面的有这个script的命令
$ lerna run --scope my-component test10. lerna exec
$ lerna exec -- < command > [..args] # runs the command in all packages
$ lerna exec -- rm -rf ./node_modules
$ lerna exec -- protractor conf.js
lerna exec --scope my-component -- ls -la11. lerna link
资料参考: