脚手架系列
脚手架系列 - 比较 lerna 和 lerna + yarn workspace 和 pnpm
目录
-
原生脚手架开发痛点
-
创建package
-
脚手架开发与测试
-
脚手架发布与上线
-
lerna包管理存在的一些问题
原生脚手架开发痛点
痛点一:重复操作
- 多package本地link
- 多package依赖安装
- 多package单元测试
- 多package代码提交
- 多package代码发布
痛点二:版本一致性
- 发布时版本一致性
- 发布后相互依赖升级
当然上述问题可以写shell脚本,但是package是动态增减的,会涉及修改shell脚本,因此不是合理的方案。
Lerna
Lerna 是一个优化基于git+npm的多package项目的管理工具
Lerna 就是解决原生开发脚手架的痛点,是架构优化的产物,它揭示了一个架构的真理:项目复杂度提升后,就需要对项目架构优化。架构优化的主要目标是以效能为核心。
优势
- 大幅减少重复操作
- 提升操作的标准化
项目初始化
lerna init 执行初始化命令
lerna是基于git的,所以lerna init会增加.git文件夹和lerna.json本身配置文件
npm init -y
npm install -g lerna
lerna init
添加.gitignore内容
.vscode
.idea
node_modules
packages/**/node_modules
创建package
lerna create 创建package
lerna create core
注意:core是文件名,命令行中修改name为 @mygroup/core,发布到npm上前,先到npm上添加组织名 mygroup才能发布
lerna add 安装外部包或者内部依赖包
lerna add @imooc-cli/utils 会给packages目录下所有项目安装这个包
lerna add @imooc-cli/utils packages/core 只会给core项目增加这个包
lerna add @mo-demo/cli-shared-utils --scope @mo-demo/cli // 增加内部模块之间的依赖
注意:
-
lerna add 为 packages 下对应项目安装 node_modules ,不会在根目录下安装, 即
不存在提升 -
需要在根目录 node_modules 安装包要用 npm install
相当于 批量 npm install 外部包 和 npm link 内部包
lerna link 依赖内部包
packages中有多个包,内部存在依赖时,操作方式
- 先在对应子项目的package.json的dependencies中增加内部依赖包
- 然后在根目录执行npm link
lerna link
相当于 npm link 和 npm link 包 ,全局安装依赖和建立软连接,如果依赖很多,包很多,npm link 和 npm unlink 就很繁琐,使用lerna link 就便捷
脚手架开发与测试
lerna exec 批量执行shell脚本
批量如删除所有packages下node_modules目录, scope参数可以是限定项目名
lerna exec -- rm -rf node_modules/ 删除所有packages下node_modules目录
lerna exec --scope @mygroup/core -- rm -rf node_modules/ 只删除@mygroup/core下node_modules目录
lerna run 批量执行npm命令
批量如所有packages的package.json下scripts下执行test命令
lerna exec test 所有packages下test命令
lerna exec --scope @mygroup/core test 只@mygroup/core下test命令
lerna clean 批量清空依赖
批量批量清空 packages 下的node_modules
lerna clean
lerna bootstrap 批量重装依赖
批量批量 执行 npm install
lerna bootstrap
lerna add --hoist依赖提升- 省去每次都输入
--hoist參數的麻烦,可以在lerna.json配置
"command":{
"bootstrap":{
"hoist":true
}
}
脚手架发布与上线
lerna publish 发布
- 会提交到git 仓库
- 会在git仓库打tag
- 会发布到npm 仓库
注意:需要讲packages下所有项目的package.json增加publishConfig才可发布
"publishConfig":{
"access":"public"
}
lerna 发布会自动打tag,可能存在的情况是打好tag后,但是并没有推送到npm服务器上,再执行 lerna publish 时,检查到并没有代码更新,就不会执行publish命令,这种情况使用:
lerna publish from-package // 从最近一个commit修改的vision且没有发布的版本发布出去
lerna包管理存在的一些问题
-
lerna add\clean\bootstrap 命令都是只对packages下项目有效,所以新拉项目安装依赖,需要
npm install + lerna bootstrap一起才能安装上所有依赖 -
lerna add 为 packages 下对应项目安装独立 node_modules ,不会在根目录下安装, 即
不存在提升,所以相同依赖包会在每个package下重复安装一份 -
需要在根目录 node_modules 安装包要用 npm install