# changesets
changesets
主要关心 monorepo
项目下子项目版本的更新、changelog
文件生成、包的发布。
pnpm add @changesets/cli -D
特点
- 在开发时,需要开发者提供本次变更涉及的包名称、升级版本类型(
patch
、minor
、major
)及变更信息,即changeset
。 - 在发布版本时,会根据
changeset
自动升级对应包的版本号,并在对应的包中生成Changelog
信息。 - 在
Monorepo
场景中,changeset
会自动生成仓库依赖图,升级时只会升级变更包及相关依赖包的版本号。
# 初始化
执行 changeset init
,在项目根目录下生成一个 .changeset
目录,里面会生成一个 changeset
的 config
文件
{
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"baseBranch": "master",
"updateInternalDependencies": "patch",
"ignore": []
}
2
3
4
5
6
7
8
9
10
11
commit
:为true
时,在执行change
和version
命令时,将自动执行提交代码操作fixed
:用于monorepo
中对包进行分组,相同分组中的包版本号将进行绑定,每次执行version
命令时,同一分组中的包只要有一个升级版本号,其他会一起升级。支持使用正则匹配包名称。linked
:和fixed
类似,也是对monorepo
中对包进行分组,但是每次执行version
命令时,只有和changeset
声明的变更相关的包才会升级版本号,同一分组的变更包的版本号将保持一致。支持使用正则匹配包名称。access
:如果配置为restricted
,将作为私有包发布,如果为public
,则发布公共范围包。
提示
对于仓库中存在部分包需要配置 access,可以在 package.json 中配置 publishConfig,例如:
{
"publishConfig": {
"registry": "https://registry.npmjs.org/",
"access": "public"
}
}
2
3
4
5
6
baseBranch
:仓库主分支。该配置用于计算当前分支的变更包并进行分类。updateInternalDependencies
:用于声明更新内部依赖的版本号规则。当执行version
命令升级版本号时,默认会自动更新仓库中使用该包的依赖声明。配置该字段为minor
后,如果升级版本号为patch
类型,将不会自动更新引用依赖声明。
提示
e.g.,当配置 updateInternalDependencies 为 minor 时,升级 pkg-a 至 1.0.1 时,pkg-b 中的 pkg-a 的依赖版本将不会更新,只有 pkg-a 升级版本号为 1.1.0 或者 2.0.0 时,才会更新 pkg-b 中的 pkg-a 的依赖。
changelog
:配置为false
时,执行version
命令时,在CHANGELOG.md
文件中只声明版本号,不声明其他Changelog
信息。ignore
:用于声明执行 version 命令时忽略的包,和version
命令的--ignore
参数用法一致,注意两者不能同时使用。
# 第一次发布
在项目根目录下直接运行下方指令为子项目发布第一个版本。发布完成后,提交代码~
pnpm run build
pnpm changeset publish
2
3
提示
@xxx/xx
形式的包会被当作私有包,默认需要以组织的方式登录,可以通过参数发布为公共包pnpm publish --access public
1changeset publish
时指定参数不生效,此时可以在package.json
中指定配置{ "publishConfig": { "access": "public" } }
1
2
3
4
5不需要发布的包可以在
package.json
中设置{ "private": true }
1
2
3
# 生成changeset文件
一个 changeset
是个包含了在某个分支或者 commit
上改动信息的 md
文件,包含的内容包括:
- 本次变更涉及哪些包的变更。
- 本次变更需要升级的版本号类型,类型符合 semver (opens new window) 规范。
- 本次变更的
Changelog
信息。
这个文件的本质是对包的版本和 Changelog
做一个预存储,我们也可以在这些文件中修改信息。
模块工程方案
在根目录执行 pnpm changeset add
,选择本次变更需要升级的版本号类型,填入 Changelog
信息,并点击两次回车,执行完成后,将在项目的 .changeset
目录创建对应的 changeset
文件
Monorepo 工程方案
在根目录执行 pnpm changeset add
,选择本次需要升级的包列表,分别选择不同版本类型对应的包,changeset
会询问版本号类型,如果存在包未选择这两种类型,将会默认使用 patch
类型,填入 Changelog
信息,并点击两次回车,执行完成后,将在项目的 .changeset
目录创建对应的 changeset
文件
提示
- 假设现在要进行迭代,我们从主分支上切一个分支出来,完成代码修改,如果需要变更记录,执行
pnpm changeset add
命令生成changeset
文件,最后提交代码。 changeset
文件需要一并提交到远程仓库中。在后续的新版本发布后,这些changeset
文件是会被自动消耗掉的。
# 发布测试版本
- 进入
pre
模式
执行下方命令中的一条
pnpm changeset pre enter alpha # 发布 alpha 版本
pnpm changeset pre enter beta # 发布 beta 版本
pnpm changeset pre enter rc # 发布 rc 版本
2
3
- 修改包的版本
pnpm changeset version`
执行后包的版本发生变化,其他项目以来的此包的版本也相应发生变化
- 发布测试版本
pnpm run build
pnpm changeset publish
2
3
- 退出
pre
模式
发布前退出模式
pnpm changeset pre exit
# 发布正式版本
- 修改版本号
pnpm changeset version
- 发布
pnpm changeset publish
changeset
会检查当前工作区中所有包的版本是否已经被发布过,如果没有则自动发布。