Lerna官网
原生脚手架开发痛点分析
- 痛点一:重复操作
- 多Package本地link
- 多Package依赖安装
- 多Package单元测试
- 多Package代码提交
- 多Package代码发布
- 痛点二:版本一致性
- 发布时版本一致性
- 发布后相互依赖版本升级
package越多,管理复杂度越高
Lerna简介
Lerna 是一个优化基于git+npm的多package项目的管理工具
优势
- 大幅减少重复操作
- 提升操作的标准化
Lerna是架构化的产物,它揭示了一个架构真理:项目复杂度提升后,就需要对项目进行架构优化。架构优化的主要目标往往都是以效能为核心。
案例
使用Lerna管理的大型项目
- vue-cli: github.com/vuejs/vue-c…
- create-react-app: github.com/facebook/cr…
lerna 开发脚手架流程
基于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
最终创建的目录如下:
发布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