Lerna多包管理

741 阅读2分钟

最近在写一些业务组件,想把这些业务组件沉淀到一个公共库里供给给其他项目使用,但是业务组件又是互相独立,所以想用Lerna去进行一个多包管理,然后Dumi2.x来展示组件文档。(Dumi就不多做介绍了,这里主要讲一下Lerna是啥怎么用怎么和Dumi结合,废话不多说开整0.o)

关于Lerna

Lerna是一个快速、现代化的构建系统,用于管理和发布来自同一个项目工程的多个Js/Ts的子项目。

Lerna安装与使用

安装

npm install lerna -g

初始化Lerna项目

mkdir lerna-demo && cd lerna-demo
npx lerna init

这会在lerna-demo目录下生成一个packages文件夹以及两个package.jsonlerna.json目录。下面我们来一个一个说这些东西是干什么的,怎么配置。

lerna-demo/
  packages/
  package.json
  lerna.json

learn.json

默认配置:

{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "npmClient": "npm",
  "useWorkspaces": true,
  "version": "1.0.0"
}

配置说明

字段名说明
version当前版本号
npmClient指定运行命令的包管理器(默认npm,可以设置pnpmyarn
useWorkspaces是否把项目托管给包管理器(默认为true
pacakages如果没有把useWorkspaces设置为true,需要设置一个packages属性告诉lerna包的位置的数组
command.publish.ignoreChanges通配符数组,被其中配置的匹配上的文件和文件夹不会被lerna监测更改和发布。例如我们可以配置一些*.md等等非代码改动的配置
commond.publish.message执行版本发布时更新的自定义提交信息
common.bootstrap.ignore运行lerna bootstrap指令时会忽视该字符串数组中的通配符文件
common.bootstrap.npmClientArgs该字符串数组中的参数将在lerna bootstrap命令期间直接传递给npm install

项目模式

Lerna可以使用两种模式来管理我们的项目:独立模式(independent)和固定模式(fixed)。当我们使用固定模式,所有包都将会使用同一个版本号。

固定模式

固定模式是通过单一版本来控制所有子包版本。版本信息在lerna.json文件的version里配置。当运行lerna publish时,只要有一个包改动,所有包的版本都会更新,这个是目前babel使用的模式,如果你多个子包相互依赖,可采用这个模式。

独立模式
npx lerna init --independent

独立模式子项目可以自己增加包版本号。每次发布时都会在控制台中提示每个更改过的包是补丁(patch)、小更改(minor)、大更改(major)还是自定义更改(custom change)。通过修改lerna.jsonversion字段,设置为independent也可以变更为独立模式。

packages

packages主要是用来存放子项目模块的文件夹例如:

packages/
    header/
        src/
            ...
        package.json
        rollup.config.json
        jest.config.js

    footer/
        src/
            ...
        package.json
        rollup.config.json
        jest.config.js

    remixapp/
        app/
            ...
        public/
        package.json
        remix.config.js

package.json

Lerna结合Dumi2.x

安装dumi

# 先找个地方建个空目录。
$ mkdir myapp && cd myapp

# 通过官方工具创建项目,选择你需要的模板
$ npx create-dumi

# 安装依赖后启动项目
$ npm start

加入lerna

yarn add lerna -D

lerna init --independent

配置lerna.json

{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "useWorkspaces": true,
  "npmClient": "yarn",
  "version": "independent",
  "command": {
    "publish": {
      "ignore": ["*.md", "demo/*"]
    }
  }
}

添加子项目

lerna create learn-demo-one

添加项目依赖

如果依赖是某个子项目单独在使用可以使用:

lerna add antd --scope=lerna-demo-one

但是如果整个项目都是基于react开发的,那么我们可以把react这个依赖加到顶层的package.json中作为一个公共依赖,同时需要把package.json中的private改为true

yarn add react

发布依赖

lerna publish

lerna命令集合

指令解释
lerna verison更改上次发布版本号
lerna bootstrap将本地包链接在一起并安装剩余的包依赖项
lerna list列出本地宝
lerna changed上次标记发布以来发生变化的本地包
lerna diff自上次发布以来的所有包或单个包的区别
lerna exec每个包中执行任意命令
lerna clean从所有包中删除node_modules目录
lerna import将一个包导入到带有提交历史记录的monorepo
lerna link将所有相互依赖的包符号链接在一起