Release & Changeset
概述
Walnut Admin 使用 Changesets 管理 monorepo 的多包版本号,配合 git-cliff 生成 CHANGELOG。版本策略是 5 个共享包 fixed 组(同步版本) + 3 个 app 独立版本。
我们做了什么
1. Changesets 三段式工作流
开发时:pnpm changeset:auto → 生成 .changeset/*.md 文件
版本时:pnpm changeset version → 消费 changeset,更新 package.json 版本号
发布时:pnpm changeset publish → (内部项目,暂不发布到 npm)2. Fixed Group(共享包同步版本)
{
"fixed": [[
"@walnut/utils",
"@walnut/contract",
"@walnut/client",
"@walnut/axios",
"@walnut/eslint-config"
]],
"changelog": false, // 不用 Changesets 自带的 changelog(用 git-cliff)
"commit": false, // 不让 CLI 自动 commit
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch" // 依赖升级 → 消费者至少 patch bump
}5 个共享包永远同版本号。为什么?
@walnut/contract的类型变更会影响所有消费者@walnut/utils被前后端同时依赖- 它们是紧密耦合的一组——"一荣俱荣,一损俱损"
3 个 app 独立版本。为什么?
apps/adminUI 变更不关apps/server的事apps/docs文档更新不影响apps/server- 各自有独立的 release cycle
3. 自动 changeset 生成
scripts/version/auto-changeset.ts 从 conventional commits 自动生成 changeset 文件:
pnpm changeset:auto # 扫描自上次 tag 以来的 commits → 生成 .changeset/*.md开发者不需要手动运行 pnpm changeset——只需保持 conventional commit 格式,脚本自动处理。
4. 发布流程
scripts/version/release.ts 编排完整发布流程:
auto-changeset → changeset version → git-cliff changelog → git tag → git pushpnpm release # 仅在 main 分支执行没做什么 / 为什么
不用 Changesets 自带的 changelog
Changesets 的默认 changelog 格式较简单(仅显示 changeset 摘要 + commit hash)。git-cliff 可以按 conventional commit 类型分组、带 emoji、显示 scope 和 PR 链接——格式更丰富。两者各司其职:Changesets 管版本号,git-cliff 管 changelog 格式。
不用 semantic-release
semantic-release 从 commit message 自动推断 semver bump 类型(fix: → patch, feat: → minor)。Changesets 让开发者手动确认 bump 类型——更可控,避免一条 commit message 的格式错误触发错误的版本号。
不发布到 npm
所有包 private: true 移除后设为 "access": "public"——但这代表代码公开可见(public repo),不代表实际发布到 npm。当前是内部 monorepo,通过 workspace:* 消费。
关键文件
| 文件 | 作用 |
|---|---|
| .changeset/config.json | Changeset 配置:fixed group、access、changelog |
| scripts/version/auto-changeset.ts | 从 conventional commits 自动生成 changeset |
| scripts/version/release.ts | 发布流水线编排 |