跳到主要内容

lerna

  • lerna采用的是 monorepo 模式

Lerna 是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题

  • Lerna 解决的是多包依赖管理的问题,可以动态建立软链,自动更新依赖,大大减少的人力

lerna相关系列

  • lerna 基本操作,如何更新,链接,发布等。
  • lerna 采用的是 monorepo 模式,和 multrepo 有什么区别。
  • lerna 是如何实现内部文件软链,是 npm link 么。
  • lerna 的适用场景以及包管理策略。
  • lerna 如何提升安装性能
  • lerna 如何指定发布版本,如何指定发布子目录

Lerna环境配置​

lerna 初始化​

csharp
npm i lerna -g // 全局安装lerna
lerna init // 初始化lerna目录

lerna.json 基础配置​

arduino
{
"version": '0.0.1',
"npmClient": 'cnpm', // yarn, npm
"packages": ['packages/*', 'xx/*'], // 管理多个目录
"command": {
"publish": { // lerna publish配置,忽略*.md文件,
"ignoreChanges": ["*.md"],
"message": "chore(release): publish"
},
"bootstrap": { // lerna bootstrap配置,忽略component-*包
"ignore": "component-*",
"npmClientArgs": ["--no-package-lock"]
}
}

使用 Lerna 注意事项:​

  1. Lerna 会管理 packages 下面的包的依赖关系,对于 package-2 依赖 package-1,lerna可以帮助自动管理。
  2. lerna 可以管理多个目录的依赖关系,只需要在 lerna.json 的 packages 属性配置。
  3. 当遇到异常情况需要更新或者清理缓存时, 可以使用 lerna clean 指令。

Lerna 基本操作​

lerna 基本操作命令,如何创建一次lerna的工作流。

lerna的常用命令:list, bootstrap, clean, changed, publish。

父应用和子应用添加所有依赖​

text
lerna bootstrap

给子应用添加依赖​

text
# --scope 表示需要添加的子应用package-name
lerna add dayjs --scope=app-example

# lerna add dayjs --scope=app-example --dev

查看本地包列表​

text
lerna list

删除安装依赖​

text
lerna clean

建立软链​

bash
lerna link

发布安装包​

text
lerna publish

场景使用实例​

创建一次完整的 lerna 工作流有如下流程:

lerna boostrap(依赖包安装) --> 开发模块 --> git commit --> lerna changed(查看包变化) --> lerna publish。

如下操作实例

arduino
lerna bootstrap // 安装依赖包
lerna list // 本地依赖包
lerna changed // 待发布包列表
lerna publish // 发布

Lerna 高阶操作​

publish 高级应用​

某些发布的情况,开发者需要指定安装包版本,或者指定子目录发布。

scss
lerna publish --dist-tag next // 指定当前版本号
lerna publish --contents dist // 指定dist目录为发布目录

性能提升​

如果使用 lerna bootstrap 命令会在每个子目录都安装 node_modules 依赖,导致性能变差,在开发环境下,可以使用 --hoist 在 lerna 根目录安装依赖来提升性能。

scss
lerna bootstrap --hoist // 提升到根目录

lerna如何实现软链​

npm link 可以在系统目录下建立包软链。软链可以不需要发布,就可以使用本地包,很好的提高开发效率

  • 在源码里面,lerna 实现软链使用了 symlink-dependencies 包。最终使用 fs.symlink 函数实现了文件软链

源码解析如下:

  1. command 基类是 lerna 的核心包,提供了各种指令
  2. utils 目录下提供了文件软链的各种方法,例如:create-symlink(创建软链),symlink-dependencies(软链依赖)等
  3. 在 create-symlink 文件中, 核心函数 createSymbolicLink 使用了 fs 文件类的 symlink 方法实现了文件依赖管理

父应用和子应用添加所有依赖​

text
lerna bootstrap

给子应用添加依赖​

text
# --scope 表示需要添加的子应用package-name
lerna add dayjs --scope=app-example

# lerna add dayjs --scope=app-example --dev

lerna遇到的问题​

发布失败后的解决方案​

lerna 作为多个包依赖的管理解决方案,确实解决了很多痛点,我目前在工作和生活中已经大量使用了lerna,但同时也会遇到一些问题,比如发布失败后的问题是遇到比较频繁的问题

发布包的问题,有可能你的网络情况有问题,有可能你没有登录npm(包括公司内部的 registry ),导致发布失败。这时候不能重新发版,因为已经发版过了,没有修改过记录发版不了,但是上一次又发版失败了

解决方式:

  • 1、可以重新修改过记录,重新发版 【会比较麻烦】
  • 2、可以手动回退之前版本,并且删除相应的git tag标签
bash
git reset --hard HEAD~1 && git tag -d v3.1.0