Lerna V8-脚手架框架搭建、发布

513 阅读3分钟

Lerna官网

github.com/lerna/lerna

lerna.js.org/

原生脚手架开发痛点分析

  • 痛点一:重复操作
    • 多Package本地link
    • 多Package依赖安装
    • 多Package单元测试
    • 多Package代码提交
    • 多Package代码发布
  • 痛点二:版本一致性
    • 发布时版本一致性
    • 发布后相互依赖版本升级

package越多,管理复杂度越高

Lerna简介

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

优势

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

Lerna是架构化的产物,它揭示了一个架构真理:项目复杂度提升后,就需要对项目进行架构优化。架构优化的主要目标往往都是以效能为核心。

案例

使用Lerna管理的大型项目

lerna 开发脚手架流程

image.png

基于Lerna 创建项目

安装lerna

最新版本lerna v8.1.2,需选择node版本18

脚手架项目初始化

新建目录 /imoc-cli-develop/xgm-cli-dev

初始化仓库

npm init -y

全局安装 lerna

npm i -D lerna
npm i -g lerna

查看版本

lerna -v

如何正常显示版本就可以用了

然后当我执行 lerna init 的时候,出现了下面的错误。

问题原因:lerna新版本问题

lerna init 
info cli using local version of lerna
lerna notice cli v8.1.2 
lerna ERR! Cannot initialize lerna because your package manager has not been configured to use `workspaces`, and you have not explicitly specified any packages to operate on
lerna ERR! See https://lerna.js.org/docs/getting-started#adding-lerna-to-an-existing-repo for how to resolve this

解决方案,参考官方文档:lerna.js.org/docs/gettin…

执行lerna初始化代码:lerna init --packages="packages/*"即可解决

现在的目录结构应该是这样

xgm-cli-dev
  package.json
  lerna.json

learn 自动给我们生成了一个 lerna.json 文件,新版本没有生成 packages 目录,单独创建包的时候会自动生成

// lerna.json
{
  "packages": [
    "packages/*" // 以后所有lerna创建的子级package都会放在这里
  ],
  "version": "1.0.0" // 修改一下版本
}

复制

然后我们根目录下手动创建一个 .gitignore 文件

// .gitignore
.history
.vscode
node_modules
packages/**/node_modules
packages/**/package-lock.json
lerna-debug.log
package-lock.json

创建package

xgm-cli-dev为npm上创建的组,需要提前创建,防止重名

创建core包:lerna create core,package name: (core) @xgm-cli-dev/core

创建core包:lerna create utils,package name: (core) @xgm-cli-dev/utils

最终创建的目录如下:

image.png

发布package

lerna publish

常见报错注意:

  • 发布时组织与包名需要一一对应
  • 如果发布的过程中,报nolicense的错误,那么需要在项目的根目录下添加 LICENSE.md文件
  • 需要在每个包的package.json中添加下面代码,在发布的过程中有报E402 You must sign up for private packages的情况下
  "publishConfig": {
    "access": "public"
  }

注意:

在lerna中,如果不需要用package文件夹,那么就需要在lerna.json中改定义,如下:

{
  //"packages": [ "packages/*"],
  // 改成你需要定义的文件夹
  "packages": ["command/*", "core/*", "models/*", "tools/*"],
  "version": "0.0.1"
}

可能遇到的问题

问题一:

Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna ERR! Error: Command failed with exit code 128: git tag v1.0.1 -m v1.0.1
lerna ERR! fatal: tag 'v1.0.1' already exists

解决方法:删除对应的标签

git tag -d v1.0.1

git push --delete origin v1.0.1