lerna
多个项目的代码放在在同一存储库中这种开发策略称之为 Monorepo
基于 git+npm的多package项目管理工具
lerna解决了什么问题
1、 重复操作
- 多package本地link
- 多package依赖安装
- 多package单元测试
- 多package代码提交
- 多package代码发布
2、版本一致性
- 发布时的版本一致性
- 发布后版本互相依赖的问题
yarn workspace
依赖树关系
yarn workspaces info
安装依赖
lerna bootstrap //但是我的项目不能用
相当于 yarn install 和 npm install
yarn安装/删除依赖模块
注意
workspace后面跟的不是文件夹名字是package.json的name名字
注意 -- 是json的name名字不是文件夹名字
# packageA 安装 axios
yarn workspace packageA add axios
# packageA 移除 axios
yarn workspace packageA remove axios
# root package 安装 commitizen
yarn add -W -D commitizen
# root package 移除 commitizen
yarn remove -W commitizen
lerna安装命令
package-1 package-2是项目名字
lerna add babel , 该命令会在package-1和package-2下安装babel
lerna add react --scope=package-1 ,该命令会在package-1下安装react
lerna add package-2 --scope=package-1,该命令会在package-1下安装package-2
运行
# 运行packageA 的dev命令
yarn workspace packageA dev
# 这里是在每个工作区运行 run build 命令
yarn workspaces run build
"useWorkspaces": true, // 使用yarn workspaces
"private": true, // 私有的,不会被发布,是管理整个项目,与要发布到npm的解耦
实践
需求:各package独立打包:有公用打包配置的能力
//包安装、同时安装各个子包需要的依赖
yarn install
yarn workspace cli add cli-shared-utils
//将cli-shared-utils作为cli的依赖进行安装
yarn workspaces add lodash //给所有的package安装依赖:
yarn add -W -D typescript //给根目录 安装公用的依赖
这个很少用,不是装在每个项目里面,而是根里面
//清理环境
lerna clean //清理所有的node_modules
//按顺序构建(各个package之间存在相互依赖,
//如packageB只有在packageA构建完之后才能进行构建
//,否则就会出错,需要按拓扑排序的规则进行构建)
lerna run --stream --sort build
升级与发布
升级与发布
两种模式:
Independent mode:结合Git,检查文件变动,只发布有改动的packge。(
设置方式1: 创建项目的时候 可以通过 lerna init --independent 命令,
启用独立模式管理软件包。
设置方式2: 修改 lerna.json 的 version 字段,
修改为 independent, 用来开启独立模式)
Fixed/Locked mode(默认):把工程当作一个整体来对待。每次发布packges,
都是全量发布,无论是否修改
//更新版本
//找出从上一个版本发布以来有过变更的 package
//提示开发者确定要发布的版本号
//将所有更新过的的 package 中的package.json的version字段更新
//将依赖更新过的 package 的 包中的依赖版本号更新
//更新 lerna.json 中的 version 字段
//根据commit信息自动生成该版本的CHANGELOG (配置conventionalCommits)
//提交上述修改,并打一个 tag
//推送到 git 仓库
lerna version //更新版本
//发布新包
lerna publish //包含了lerna version