Lerna 是一个优化基于 git + npm 的多 package 项目的管理工具
👉👉 Lerna官方网站
Package 越多,管理的复杂度越高。
痛点一:重复操作
Package 本地 linkPackage 依赖安装Package 单元测试Package 代码提交Package 代码发布痛点二:版本一致性
Lerna 是架构优化的产物,它揭示了一个架构真理:项目复杂度提升后,就需要对项目进行架构优化。架构优化的主要目标往往都是以效能为核心。
进入 npm 官网,点击头像,然后点击 + Add Organization
输入组织名,然后点击 create 。
下一步直接点 skip 就行了,忘了截图了。
然后我们就有了一个组织,这样才可以把包发到 npm 上并且不用担心命名重复的问题
新建目录 /imoc-cli-deve/imoc-cli-deve
初始化仓库
npm init -y全局安装 lerna
npm i -D lerna
npm i -g lerna查看版本
lerna -v如何正常显示版本就可以用了
然后当我执行 lerna init 的时候,出现了下面的错误。
查阅资料,最终的解决方案是不要使用 cmd 去执行,使用 git bash 去执行就可以了。
现在的目录结构应该是这样
imoc-cli-deve
packages/
package.json
lerna.jsonlearn 自动给我们生成了一个 lerna.json 文件,以及一个 packages 目录
// lerna.json
{
"packages": [
"packages/*"
],
"version": "1.0.0" // 修改一下版本
}然后我们根目录下手动创建一个 .gitignore 文件
// .gitignore
.history
.vscode
node_modules
packages/**/node_modules
lerna-debug.log通过下面命令创建一个可以被 lerna 管理的 package
lerna create <name>执行完会让你输入一些东西,修改一下包名和描述即可,其他的直接回车跳过,后面会手动改。
lerna 会自动在 package 目录下生成下面这些东西
└── packages
└── core
├── lib
| └── core.js
├── package.json
├── README.md
└── __tests__
└── core.test.js以同样的方式再创建一个 utils 包存放一些工具
通过下面的命令给指定的 package 安装依赖
lerna add <package> [loc]如果不指定 package ,那么就会给所有的包同时安装依赖
通过下面的命令清空安装的依赖
lerna clean 通过下面的命令重装依赖
lerna bootstrap 下面命令是给 packages/core 这个 package 安装 @imooc-cli/utils 这个依赖
lerna add @imooc-cli/utils packages/core/以下命令用来将所有 lerna 管理的 package 进行相互 link
lerna link修改 packages/core 中的依赖,添加 @imoc-cli-deve/utils
// package.json
"dependencies": {
"@imoc-cli-deve/utils": "^1.0.0"
}然后执行 lerna link 命令
这个时候我们查看 packages/core 下的 node_modules 中的 utils 包,会发现有个小箭头,就说明 link 成功了。
以下命令用来给所有 lerna 管理的 package 执行 command
lerna exec -- <command>下面是删除所有 package 中的 node_modules 文件夹
lerna exec -- rm -rf node_modules下面是删除指定包 @imoc-cli-deve/core 下的 node_modules 文件夹
lerna exec --scope @imoc-cli-deve/core -- rm -rf node_modules以下命令用来给所有 lerna 管理的 package 执行一个 npm 脚本(如果存在的话),就是 package.json 中 scripts 属性中的内容。
lerna run <script>下面是执行所有 package 中的 test 脚本
lerna run test下面是执行指定包 @imoc-cli-deve/core 中的 test 脚本
lerna run --scope @imoc-cli-deve/core test以下命令用来查看自上次发布后,哪些 lerna 管理的 package 发生了变更
lerna changed另外两个命令需要我们先提交代码
git add .
git commit -m "lerna"以下命令用来查看自上次发布后,哪些 lerna 管理的 package 的内容发生了变更
lerna diff在 gitee 上新建一个代码仓库
然后执行以下指令连接远程仓库
git remote add origin https://gitee.com/hzw_0174/imoc-cli-deve.git // 连接远程仓库
git remote -v // 查看连接状态
git push origin master --set-upstream // 设置默认分支推送代码以下命令用来升级 lerna 管理的 package 的版本
lerna diff通常情况下我们只需要 Patch Minor Major 当中进行选择。
以下命令用来发布 lerna 管理的 package 到 npm 仓库。
lerna publish也是会让你选择版本,如果你没有执行过 lerna version ,然后我们选择第一个,输入 y
发现最后报了一个错误
lerna ERR! E402 You must sign up for private packages是因为没有登录,执行 npm login ,输入用户名密码登录
然后在 core 这个 package 里面添加 bin/index 文件,修改 package.json
// bin/index
#! /usr/bin/env node
console.log('hello imoc-cli')
// package.json
"bin": {
"imoc-cli-deve": "bin/index.js"
},然后修改所有 package 的 package.json
// package.json
"publishConfig": {
"registry": "https://registry.npmjs.org/",
"access": "public"
},最后把所有 package.json 和 lerna.json 的版本号统一到最新版本,这是因为虽然我们之前的几次操作发不到 npm 失败了,但是 gitee 仓库已经打上 tag 了,再次发布就会报错。
然后再次执行 lerna publish
会显示成功推送两个包,然后去 npm 官网上看一下是否成功了
可以看到已经存在了,并且版本都是 1.0.4 , 到这里一个完整的 lerna 发布流程就结束了。