Lerna简介 
- 基于 git + npm 的多package项目管理工具
- 实现原理 - 通过import-local优先调用本地lerna命令
- 通过yargs生成脚手架,先注册全局属性,再注册命令,最后通过parse方法解析参数
- lerna注册命令时需要传入- builder和- handler两个方法,- builder用于注册命令专属的- options,- handler用来处理命令的业务逻辑
- lerna通过配置- npm本地依赖的方式来进行本地开发,具体写法实在- package.json的依赖中写入- file:your-local-module-path,在- lerna publish时会自动将该路径替换
 
- 通过
原生脚手架开发痛点分析 
- 痛点一:重复操作 - 多Package本地操作
- 多Package依赖安装
- 多Package单元测试
- 多Package代码提交
- 多Package代码发布
 
- 痛点二:版本一致性 - 发布时版本一致性
- 发布后互相依赖版本升级
 
package越多,管理复杂度越高
Lerna简介 
Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.
Lerner是一个优化基于 git + npm 的多package项目的管理工具
优势 
- 大幅度减少重复操作
- 提升操作的标准化
lerna是架构优化的产物,它揭示了一个架构真理:项目复杂度提升以后,就需要对架构进行优化。架构优化的主要目标往往都是以效能为核心。
官网 
案例 
使用lerna管理的大型项目:
lerna 开发脚手架流程 
- 初始化项目 - 初始化npm项目
- 安装lerna
- lerna init初始化项目
 
- 创建package - lerna create创建package
- lerna add安装依赖
- lerna link链接依赖
 
- 开发和测试 - lerna exec执行shell脚本
- lerna run执行npm命令
- lerna clean清空依赖
- lerna bootstrap重装依赖
 
- 发布上线 - lerna version、- bump version
- lerna changed查看上版本以来的所有变更
- lerna diff查看diff
- lerna publish项目发布
 
基于lerna创建项目 
bash
# 1. 安装lerna到全局环境
npm i lerna -g
# 2. 安装lerna到开发环境
npm i lerna --save-dev
# 3. 初始化
lerna init- 添加.gitignore
.gitignore
node_modules
.vscode
.idea
packages/**/node_modules
lerna-debug.logbash
# 5. 创建package: core
lerna create core
# 在npm账户创建一个可用的组织名称,输入组织名称作为package的前置,避免发布时重名
package name: (core) @blink-cli-dev/core
# 6. 创建package: utils
lerna create utils
# 记得组织名称
package name: (core) @blink-cli-dev/utilslerna核心操作 
- lerna add为所有包安装依赖
- lerna link自动为互相引用的包添加软连接
- lerna exec执行shell命令,上下文在各个包目录下
- lerna run执行各个包的npm命令
- lerna clean清空所有的依赖:删除node_modules
- lerna bootstrap重新安装node_modules,建立互相引用的软连接
- lerna version更新包版本
- lerna publish更新包版本 在推送版本后使用- 可以选择根据git或者package的状态进行发布:lerna publish from-git或者lerna publish from-package,使用from-package时会将package.json中的依赖修改为线上依赖
- 当出现lerna ERR! E402 You must sign up for private packages错误时,表示发布的包为私有包,应该将包发布为公开的包,在package.json中配置:json"publishConfig": { "access": "public" },
 
- 可以选择根据git或者package的状态进行发布:
