最近在写一些业务组件,想把这些业务组件沉淀到一个公共库里供给给其他项目使用,但是业务组件又是互相独立,所以想用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.json、lerna.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,可以设置pnpm、yarn) |
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.json的version字段,设置为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 | 将所有相互依赖的包符号链接在一起 |