学习目标
带着以下几个目标和问题来学习 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 文件,如图:
这个文件定义了一个自执行函数,这个函数的主要功能有三个:
- 在 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 提交等操作。