一段时间以前看了 Slate 更新使用 changesets 管理基础库的更新日志觉得很不错,加之考虑到我们使用 standard-version
的一些弊病,于是决定研究下它是怎么用的,看看能不能解决我现在的问题。
初步尝试发现,需求匹配度很高, 操作流程清晰、没有黑盒处理 。
Changesets 介绍
简单点说就是生成 changelog 的工具。
官方说法:changesets 是用于管理版本及变更日志的工具,专注多包管理。
怎么做的?
生成的 changelog 遵循 语义化版本 2.0.0 ,具体的做法是先根据你的代码更改生成 changeset 文件,然后发版的时候合并这些 changeset 文件、更改版本号、生成 changelog。
如何使用?
安装依赖库
devDependencies: {
"@changesets/changelog-github": "^0.3.0",
"@changesets/cli": "^2.19.0"
}
初始化配置
npx changeset init
手动修改配置
{
"$schema": "https://unpkg.com/@changesets/config@1.5.0/schema.json",
"changelog": [
"@changesets/changelog-github",
{
"repo": "worktile/slate-angular" // 改为你的 github 仓储
}
],
"commit": false,
"linked": [],
"access": "public",
"baseBranch": "master",
"updateInternalDependencies": "patch",
"ignore": []
}
这里的 @changesets/changelog-github 是一个生成 changelog 的插件,如果不修改这个配置也可以工作,但是生成的 changelog 不太完美!
生成 chanegset
1、选择版本类型
2、输入更新摘要
3、确定生成 changeset 文件
4、提交更改
5、生成 changelog
npx changeset version
- 删除 changeset 文件
- 更语义化新版本号
- 生成 changelog
- 包含代码提交人
- commit 链接
- 变更摘要
其它
查找 package.json
最初遇到一个问题就是它更改版本号时找的 package.json 是项目根目录下的,而我的基础库的代码及 package.json 是在 packages 目录下,我期望这个工具可以把 packages/package.json 下的版本号一起给我改掉,最终排查发现需要在根目录下的 package.json 中配置下 workspace,如下图所示:
配置为 packages 主要是因为我这个项目只有一个库,所以 packages 下直接就是源代码,如果是多个库一起通常会有一个二级目录,那么可以配置为 “packages/*”。
这也带来了另外一个问题,我必须要把我的 changelog 文件移动到 packages 目录下,从这也可以看出 changesets 核心是处理多包场景的。
配置 GITHUB_TOKEN
前面提到前面截图格式的 CHANGELOG ,需要访问你的 github 信息,所这里需要配置一个环境变量。
- 生成 GITHUB_TOKEN ( github.com/settings/to… )
- 配置环境变量
增加配置记录:
export GITHUB_TOKEN=your_token
错误一
说的是你还没有把 commit 提交上,无法根据 commit 获取到提交者的账户地址,这时只需要把本地的 commit 更改 push 到 github 就可以。
错误二
说明前面提到的 GITHUB_TOKEN 环境变量配置没有生效。
可以暂时使用 GITHUB_TOKEN=your_token npx changeset version
生成。
多包管理
因为我这边的场景不是多包,研究不是很深,但是 changesets 的特点就是多包支持,我也看了他们源代码的仓储 github.com/changesets/… 就是多包管理,它能区分出修改的代码在那个包,提示选择针对那个包增加更新摘要,非常不黑盒。