使用 Changesets 管理类库版本及更新日志

6,893 阅读3分钟

一段时间以前看了 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、选择版本类型

image.png

2、输入更新摘要

image.png

3、确定生成 changeset 文件

image.png

4、提交更改

image.png

5、生成 changelog

npx changeset version

image.png

  1. 删除 changeset 文件
  2. 更语义化新版本号
  3. 生成 changelog
    1. 包含代码提交人
    2. commit 链接
    3. 变更摘要

其它

查找 package.json

最初遇到一个问题就是它更改版本号时找的 package.json 是项目根目录下的,而我的基础库的代码及 package.json 是在 packages 目录下,我期望这个工具可以把 packages/package.json 下的版本号一起给我改掉,最终排查发现需要在根目录下的 package.json 中配置下 workspace,如下图所示:

image.png

配置为 packages 主要是因为我这个项目只有一个库,所以 packages 下直接就是源代码,如果是多个库一起通常会有一个二级目录,那么可以配置为 “packages/*”。

这也带来了另外一个问题,我必须要把我的 changelog 文件移动到 packages 目录下,从这也可以看出 changesets 核心是处理多包场景的。

image.png

配置 GITHUB_TOKEN

前面提到前面截图格式的 CHANGELOG ,需要访问你的 github 信息,所这里需要配置一个环境变量。

  1. 生成 GITHUB_TOKEN ( github.com/settings/to…
  2. 配置环境变量

image.png

增加配置记录:

export GITHUB_TOKEN=your_token

错误一

image.png

说的是你还没有把 commit 提交上,无法根据 commit 获取到提交者的账户地址,这时只需要把本地的 commit 更改 push 到 github 就可以。

错误二

image.png

说明前面提到的 GITHUB_TOKEN 环境变量配置没有生效。

可以暂时使用 GITHUB_TOKEN=your_token npx changeset version ​生成。

多包管理

因为我这边的场景不是多包,研究不是很深,但是 changesets 的特点就是多包支持,我也看了他们源代码的仓储 github.com/changesets/… 就是多包管理,它能区分出修改的代码在那个包,提示选择针对那个包增加更新摘要,非常不黑盒。