lerna与lerna-changelog使用介绍

Front End 工具介绍

lerna用于管理多package,且各package可能会互相引用的项目。

lerna通过两种方式管理子项目的版本号:

  • Fixed/Locked mode (default):每次执行lerna publish都会将所涉及到的包升级到最新一个版本,开发者只需要确定发布下一个version
  • Independent mode:由开发者自行管理子项目的version,每次执行lerna publish都需要确定每个包的下个版本号。

基本使用

以下命令以yarn为主。

Install 安装

yarn global add lerna

Init 初始化项目

lerna init 命令执行完毕后,会在生成对应的目录结构。

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

Lerna.json 配置

{
  "version": "1.1.3", // 项目版本
  "npmClient": "npm", // 默认使用的npm,可改为yarn
  "command": { // lerna 内置命令的配置
    "publish": {
      "ignoreChanges": ["*.md", "**/test/**",], // 发布时忽略部分文件的改动,配置此项可以减少不必要的publish。
      "message": "chore(release): publish" // git commit message
    },
  },
  "packages": ["packages/*"]
}

Create 创建子项目

lerna create <name> 创建一个子项目,并会根据交互提示生成对应的package.json

Add 添加依赖

lerna add <package>[@version] [--dev] [--exact]

  • lerna add eslint: 所有包都会装上eslint
  • lerna add eslint --scope=package1:只有package1会装上。
  • lerna add eslint packages/prefix-*:符合prefix的包会装上。

options:

  • -dev:添加到devDependencies
  • --exact: 只安装特定版本

如果添加的是子项目,则会通过link软连接到对应的项目中。 lerna add package1 --scope=package2

Run 执行npm script命令

lerna run <script> -- [..args]

  • lerna run test:则会执行所有子项目中的test
  • lerna run --scope package1 test:只执行package1中的test
  • lerna run --ignore package-* test:只执行除了匹配package-*外的项目中的test

Exec 执行任意命令

lerna exec -- <command> [..args]

lerna run类似,只不过它可以执行任意命令。 eg: lerna exec -- rm -rf ./node_modules

其他命令

  • lerna bootstrap:安装各子项目依赖,对相互引用的项目进行软连接,在子项目中执行npm run prepublishnpm run prepare
    • --hoist [glob]:会将子项目的匹配的依赖(eg:eslint, jest等),统一放在根目录的node_modules中,减少安装时间,但仅限npmClient=npm
    • —nohoist [glob]: 匹配的依赖(eg: babel)会安装到子项目中的node_modules
  • lerna clean:删除子项目的node_modules
  • lerna link:同bootstrap第二步。

进阶使用

Lerna-changelog

lerna-changelog基于pr来为项目生成changelog

可参考repo

使用步骤
  • master分支切换出feature/bugfix等分支,参考git-flow
  • 完成开发后进行commit,推荐使用commitizen来规范commit msg,同时有助于对后续子项目生成changelog
  • 将新分支pushremote端。
  • 创建pr,并打上label,此处一定要打上labellearn-changelog就是根据label来确定该pr属于feature/bugfix/document等。
  • 切记要在merge之前打上label
  • 进行merge pr操作。
  • 本地切换到master分支并进行pull操作。
  • 执行lerna-changelog,既可得到一份changeling
注意

prlabel并不能随意设置,一定要在项目中声明对应才生效。

官方默认支持breaking/enhancement/bug/documentation/internal,如果想用其他,则需要在package.json中进行相应的配置。

{
  "changelog": {
    "labels": {
      "feat": ":rocket: New Feature",
      "bug": ":bug: Bug Fix",
      "doc": ":memo: Documentation",
      "internal": ":house: Internal",
      "breaking": ":boom: Breaking Change"
    }
  }
}

子项目的changelog

尚未实践过,具体还需参考README

结语

lerna的使用已介绍完毕,上述内容可满足日常开发需求,更多详情还需参考官方文档。