文章目录
背景
changesets 是 jira 公司 atlassian 的产品,目前已经转由 changesets 新组织专门维护。
- repo 地址:changesets/changesets
谁在用?
先置理论
聊聊工作流
workflow 一致性问题
如何达成一致协作的 workflow?
- 公司内:拉通对齐形成一致合力
- 开源:github bot + github actions
开源项目的工作流解法
官方推荐自动化解法:Automating Changesets
github bot
- Bot 介绍:changeset-bot
-
规范开发者行为
-
自动生成 release changelog 报告,可控制的统一发版行为 (例子:changesets pull #718 )
github actions
- action 地址:changesets/action
所以开源项目的 Auto workflow 的解法流程是:
-
开发阶段:开发者开发代码,进行 PR ,由 github bot 规范保证提交变更集,此处附带了:
a. 单次变动的 changelog
b. 影响 version 程度 -
收集阶段:项目 owner 收集 approve 需要的 PR ,此时 github bot 会以一个 PR 为形式,积累所有变动的发版 PR 。内包含了:
a. 项目 release changelog
b. 每个子包的 version 变化
c. 每个子包的 changelog -
发版阶段:经过一段时间,收集足够 PR (变更集) 后,项目 owner 合并 github bot 提出的发版 PR ,由 github actions 自动发版,此处会进行:
a. 自动发版至 npm
b. 每个子包接收 changelog 附加、version 变化
实践赋能
安装 changesets
# 安装 changesets
pnpm add -W -D @changesets/cli
# 初始化 changesets 文件夹
npx changeset init
配置 changestes
配置 .changeset/config.json
:
{
"$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
// changelog 生成方式
"changelog": "@changesets/cli/changelog",
// 开源项目可用 github 格式的 changelog,会附带 commit link
// "changelog": ["@changesets/changelog-github", { "repo": "changesets/changesets" }]
// 不要让 changeset 在 publish 的时候帮我们做 git add
"commit": false,
// 配置哪些包要共享版本
// 参考1:https://github.com/changesets/changesets/blob/main/docs/config-file-options.md#linked-array-of-arrays-of-package-names
// 参考2:https://github.com/changesets/changesets/blob/main/docs/linked-packages.md#using-glob-expressions
"linked": [],
// 公私有安全设定,内网建议 restricted ,开源使用 public
"access": "restricted",
// 项目主分支
"baseBranch": "origin/main",
// 确保某包依赖的包发生 upgrade,该包也要发生 version upgrade 的衡量单位(量级)
// https://github.com/changesets/changesets/blob/main/docs/config-file-options.md#updateinternaldependencies
"updateInternalDependencies": "patch",
// 不需要变动 version 的包
"ignore": [],
// 在每次 version 变动时一定无理由 patch 抬升依赖他的那些包的版本,防止陷入 major 优先的未更新问题
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
// https://github.com/changesets/changesets/blob/c68536edf4c04e7fdf5594ec9c69471cd86fd0ce/packages/assemble-release-plan/src/determine-dependents.ts#L88
"updateInternalDependents": "always"
}
}
各个选项介绍可直接参看官方文档说明,这里给出两份不同场景的推荐解法:
业务项目
{
"$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"linked": [],
"access": "restricted",
"baseBranch": "origin/main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"updateInternalDependents": "always"
}
}
开源项目
{
"$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
// ⬇️ 这里和业务的配置不一样~
"changelog": ["@changesets/changelog-github", { "repo": "owner/repo" }],
"commit": false,
"linked": [],
// ⬇️ 这里和业务的配置不一样~
"access": "public",
"baseBranch": "origin/main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"updateInternalDependents": "always"
}
}
修改 packages.json
修改项目根目录的 package.json
:
// package.json
// 新增
"scripts": {
// 构建整个项目的产物
"build": "pnpm -r --filter ./packages run build",
// 1. 开始交互式填写变更集
"changeset": "changeset",
// 2. 用来统一提升版本号
"version-packages": "changeset version",
// 3. 构建产物后发版
"release": "pnpm build && pnpm release:only",
"release:only": "changeset publish --registry=https://registry.npmjs.com/"
}
// 新增
"publishConfig": {
"access": "public"
}
这里同样给出两种不同场景的解法:
业务项目
// package.json
"scripts": {
"build": "pnpm -r --filter ./packages run build",
// ⬇️ 由于需要频繁使用,本地用更短的命令来节省成本