脚手架系列 - Lerna 使用介绍

1,169 阅读4分钟

脚手架系列

脚手架系列 - 从0制作脚手架实战

脚手架系列 - 脚手架原理

脚手架系列 - Lerna 使用介绍

脚手架系列 - 比较 lerna 和 lerna + yarn workspace 和 pnpm

目录

  • 原生脚手架开发痛点

  • 创建package

  • 脚手架开发与测试

  • 脚手架发布与上线

  • lerna包管理存在的一些问题

原生脚手架开发痛点

痛点一:重复操作

  • 多package本地link
  • 多package依赖安装
  • 多package单元测试
  • 多package代码提交
  • 多package代码发布

痛点二:版本一致性

  • 发布时版本一致性
  • 发布后相互依赖升级

当然上述问题可以写shell脚本,但是package是动态增减的,会涉及修改shell脚本,因此不是合理的方案。

Lerna

Lerna 是一个优化基于git+npm多package项目的管理工具

Lerna 就是解决原生开发脚手架的痛点,是架构优化的产物,它揭示了一个架构的真理:项目复杂度提升后,就需要对项目架构优化。架构优化的主要目标是以效能为核心。

优势

  • 大幅减少重复操作
  • 提升操作的标准化

项目初始化

image.png

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

image.png

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 就便捷

脚手架开发与测试

image.png

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
    }
}

脚手架发布与上线

image.png

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