学习目标

带着以下几个目标和问题来学习 release-it

  • release-it 是什么?
  • 学会使用 release-it
  • release-it 的工作原理是什么?
  • npm init release-it 命令是怎样生成的项目?

好记性不如烂笔头

  • 执行 npm init release-it 命令时记得换 npm 源,否则安装会很慢

  • npm init release-it 怎么没有初始化项目?

    通过阅读 release-it 仓库的文档,npm init release-it 是相对于直接安装是更推荐的用法。

    我理解的这行命令会初始化项目,但是结果有点出入,下面是我操作的步骤。

    新建了一个名字为 release-it-demo 的文件夹,在终端中打开后执行 npm init release-it 时报了个警告 saveError ENOENT: no such file or directory,而且并没有为项目生成package.json 以及 .release-it.json 文件。

    查看 npm-init | npm Docs 后,通过在命令后面加上项目名称的方式也无法自己生成上述的两个文件。

学习使用 release-it

release-it 是什么?

官网给出的介绍如下:

自动化版本控制和包发布

Automate versioning and package publishing

它可以自动提升版本号,自动打 tag,生成 changelog 等。

使用 release-it

初始化一个名为 release-it-demo 的项目。

新建 .release-it.json 文件,写入下面的配置:

{
  "github": {
    "release": false
  },
  "git": {
    "commitMessage": "release: v${version}"
  },
  "npm": {
    "publish": false
  },
  "hooks": {
    "after:bump": "echo 更新版本成功"
  },
  "plugins": {
    "@release-it/conventional-changelog": {
      "preset": "angular",
      "infile": "CHANGELOG.md"
    }
  }
}

安装 changelog 插件

npm i @release-it/conventional-changelog -D

运行

npm run release

输入完package.json 的版本号增加,生成 CHANGELOG.md 文件,并且控制台会询问你用不用提交,要不要打TAG,要不要推送。

release-it 的工作原理是什么?

克隆 release-it 仓库。

npm init release-it的原理

npm init < initializer > 用于创建一个空项目或者为已有项目生成 package.json, initializer 是一个名为 create-< initializer > 的 npm 包,将由 npx 安装, 也就是说 npm init release-it 实际上执行的是 npx create-release-it.

打开 create-release-it/index.js 文件,如图:

image.png

这个文件定义了一个自执行函数,这个函数的主要功能有三个:

  • 在 package.json 的文件中生成配置项
  • 生成 .release-it.json 文件
  • 在项目中安装 release-it 依赖

这也就是刚开始项目中没有 package.json 文件时,控制台报警告的原因。

源码是如何实现 npm run release

查看package.json配置中的 scripts 脚本,发现执行了lib下的release-it.js

<img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2750e0971c4042b99d9546bc12cbfa47~tplv-k3u1fbpfcp-watermark.image?" alt="" width="80%" />

在 release-it.js 中调用的是 lib/cli.js,查看cli.js

<img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/85e4b324a78941469a9ec8d5c342a99f~tplv-k3u1fbpfcp-watermark.image?" alt="" width="60%" />

发现 npm run release 不带-v,-h 参数时走的是 runTask 方法。

runTask 会读取 .release-it.json 文件中的配置,完成相应的更改版本号,一句hook生成 changelog,git 提交等操作。