基于Lerna+Yarn的Monorepo工具库实战

lerna + yarn workspace 使用总结

「前言」


本文是笔者在学习和应用 lerna + yarn workspace 多包工程化管理模式的过程中,记录的一些使用和问题汇总,作为笔记和分享于大家阅读。
lerna 管理方式属于 Monorepo 模式,这有别于传统的 Multirepo 单仓库应用模式,下面我们先来了解一下两者的区别。

Multirepo

传统的项目开发模式,比如 create-react-app、vue-cli 等框架模板脚手架生成的项目。

- 优点:

    1. 各模块管理自由度高;
    2. 各模块仓库体积一般不会太大;

- 缺点:

    1. 仓库分散不好找,分支管理混乱;
    2. 版本更新频繁,公共模块版本发生变化,需要对所有模块进行依赖更新;

Monorepo

- 优点:

    1. 统一的规范、构建工具;
    2. 方便版本管理和依赖,模块之间的引用调试都变得非常方便;
    3.Multirepo 的缺点就是它的优点。;

- 缺点:

    1. 随着应用扩展,仓库体积将变大。

lerna + yarn workspace 应用场景

  1. 作为业务组件库的工程环境搭建。实现单个业务组件作为单独的 npm 包 进行管理和发布无需将各个业务组件分开建立在多个 Git 中且它们的技术栈、构建工具、规范等都可以保持一致。

  2. 作为日常业务项目工程管理。
    比如有一个低代码业务需求,低代码核心工作区的交互都相同,不同的是业务场景(外层壳子和一些定制功能),低代码相关的模块都可以复用,我们只需在这个仓库内不断去扩展业务需求即可,达到核心代码的复用(当然,可能会想到将低代码核心作为线上包)。

「Lerna」

Lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目,是 Babel 自己用来维护自己的 Monorepo 并开源出的一个项目。

它可以:

  • 统一的一套规范、构建标准;
  • 对相互耦合较大、相互独立的 JS/Git 库进行管理;
  • 统一的工作流和 Code Sharing(代码共享)。

下面我们从以下几个方面来熟悉 Lerna:

  • Lerna 管理模式;
  • Lerna 入门指引;
  • Lerna 管理命令;
  • Lerna 配置文件;
  • Lerna 应用Demo;
  • Lerna 版本发布;
  • Lerna 最佳实践;
  • Lerna 注意事项。

「Lerna 管理模式」

lerna 管理项目可以使用两种模式,默认固定模式,当使用 lerna init -i 命令初始化项目时,此时为独立模式。(模式是用来管理多个 package 发包时的方式)

  1. 固定模式:
    在发包时会检测 packages 下涉及到变更的包,给这些变更的包使用同一版本,未发生变更的包不应用改版本,且不做发布升级;发布时可通过 lerna publish major(大) | minor(中) | patch (小)自定义版本。

  2. 独立模式(常用的模式):
    允许每个包有自己独立的版本号,在 lerna publish 发布时,需要为每个改动的库指定版本号(逐个询问需要升级的版本号)。此模式,lerna.json - version 字段指定为 independent。

如果 packages 下,其中一个包发生改动,另一个包依赖了这个包,即使它没有发生改动,也会被进行发布更新。

「Lerna 入门指引」

  1. 全局安装 Lerna:
npm install --global lerna


  1. 初始化 git 代码仓库:

git init lerna-repo && cd lerna-repo


不要在vscode乱推送,一定要先在github建仓库
git remote set-url origin git@github.com:xxxxx/lernaworker.git
git branch -M master
git push -u origin master

  1. 初始化 Lerna:

lerna init
// lerna info Creating package.json 
// lerna info Creating lerna.json 
// lerna info Creating packages directory 
// lerna success Initialized Lerna files



  1. 此时得到了这样一个仓库目录结构:

lerna-repo/ 
    packages/ 
    package.json 
    lerna.json



其中 packages 中保存着每个独立的包模块。

  1. 安装 lerna 到仓库 node_modules 中::

npm install

至此,我们就完成了一个 Lerna 工程的初始化工作,下面我们掌握一些操作命令来管理 Lerna。

「Lerna 管理命令」

  1. lerna init 将一个仓库初始化为 lerna 仓库(默认固定模式)。支持参数:

--independent/-i – 使用独立的版本控制模式

  1. lerna create 「package」 创建一个 package 到项目工程的 packages 下。:

lerna create 「package」
  1. lerna add 「module」:
  • 为每一个 package 安装特定依赖:
lerna add react

  • 为指定的 package 安装特定依赖:
lerna add react-dom packages/package1 
// or 
lerna add react-dom --scope=package1


  • 添加依赖到根目录 node_modules 中:
npm install typescript -D



  • package 之间的相互依赖(会在 package/package.json 下添加该依赖):
lerna add package2 --scope package1 
// or 
lerna add package2 packages/package1

注意 package 安装的相互依赖不会在当前子包产生 node_modules 我们可以在 根目录 lerna link 生成


  1. lerna publish 用于 npm 包版本发布,具体细节可看下文 「Lerna 版本发布」。

  2. lerna bootstrap 用于将 packages 链接在一起(前提是相互依赖的库),并安装 package 下的依赖到 package/node_modules。

注意,它不会安装根目录 package.json 的依赖&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值