哈喽大家好,我是专注挖掘效率神器的 效率喵 🐱!
作为一名 Monorepo 重度依赖患者,最让我头秃的时刻莫过于:发版。
以前维护多包项目,要么靠手动改 package.json 的版本号再写 CHANGELOG.md,容易眼花漏掉;要么用传统的 Lerna,但配置繁琐还经常在 CI 里神秘卡死。直到我把发版工作流迁移到了 Changesets,配上 GitHub Actions,彻底实现「写完代码 -> 提 PR -> 自动合并发版」,效率直接起飞 ⚡!
今天就给各位前端工友安利这套现代化的多包管理神器 —— Changesets。
📦 为什么选 Changesets?(工具横评)
在 Monorepo 领域,常见的版本管理方案有这么几位选手:
| 方案 | 痛点 / 特点 | 效率喵评分 |
|---|---|---|
| 手动修改 | 人工改版本号、拼写 Changelog,极其容易出错且不可追溯 | ⭐ (快逃) |
| Lerna | 老牌霸主,但历史包袱重,配置项繁复,CI 集成较笨重 | ⭐⭐⭐ |
| Semantic Release | 强依赖 Commit Message 规范,在 Monorepo 多包复杂依赖下容易误判升级范围 | ⭐⭐⭐ |
| Changesets | 去中心化声明,改动哪个包就为哪个包生成 patch,PR 驱动,对 Monorepo 原生支持极佳 | ⭐⭐⭐⭐⭐ (强烈推荐) |
💡 核心优势:Changesets 把「记录版本改动」的动作前置到了日常的 Git 提交中,由开发者在 feature 分支显式生成一个小 Markdown 文件,主分支只负责消费这些文件并自动提发布 PR。
🛠️ 1. 基础配置:5 分钟快速上手
假设我们使用的是 pnpm workspace 架构。
第一步:安装与初始化
在 Monorepo 根目录下执行:
pnpm add -Dw @changesets/cli
pnpm changeset init
执行后会在根目录生成 .changeset 文件夹和 config.json。
第二步:修改配置文件
打开 .changeset/config.json,按需调整:
{
"$schema": "https://unpkg.com/@changesets/config/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [], // 需要版本强制绑定的包名数组
"linked": [], // 依赖锁定的包名数组
"access": "public", // 发布到 npm 时的访问权限
"baseBranch": "main", // 主分支名称
"updateInternalDependencies": "patch",
"ignore": [] // 忽略发布的私有包,如 example、docs 等
}
🚀 2. 日常开发流:两步完成版本声明
当你在特性分支改动了某个子包(比如 packages/ui 和 packages/utils)后:
- 生成变更记录:
在终端敲下快捷命令:
bash
pnpm changeset - 交互式选择:
- 键盘上下键选中本次改动的包(空格选中)。
- 选择版本升级级别(
patch/minor/major)。 - 输入一句话的 Change 描述(这就是未来的 Changelog 内容)。
此时 .changeset/ 目录下会生成一个随机命名的 .md 文件(如 lazy-fox-jump.md),直接把它一起 git add 并提交 PR 即可!
🤖 3. 终极奥义:结合 GitHub Actions 自动化发版
开发只管提 PR,剩下的交给 GitHub Actions!
在项目根目录创建 .github/workflows/release.yml:
name: Release Packages
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js & pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Build Packages
run: pnpm run build
- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@v1
with:
# 自动 bump 版本的命令
version: pnpm changeset version
# 发布的命令
publish: pnpm changeset publish
title: 'chore: Version Packages'
commit: 'chore: Version Packages'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
✨ 这个 Action 怎么运作?
- 当有带
.changeset/*.md的 PR 合并进main分支时,Action 会自动聚合所有变更,并由 GitHub Bot 自动提一个新的 PR:chore: Version Packages。 - 这个 PR 会自动修改各子包的
package.json版本号,更新各自的CHANGELOG.md,并删除已消耗的 changeset 文件。 - 你只需要点击 Merge 这个 PR,Action 就会再次触发,自动打 Git Tag 并执行
pnpm publish推送到 npm!全程不需要在本地敲一行发布命令!
💡 效率喵的私房 Best Practices
- Pre-release 预发版本玩法:
如果要发
alpha或beta版本,直接执行:bash之后所有的pnpm changeset pre enter betachangeset都会生成1.0.0-beta.0这类版本,退出预发模式执行pnpm changeset pre exit即可。 - PR 必填校验(Changeset Bot): 在 GitHub 仓库中安装 Changeset Bot,它可以提示贡献者「你这次 PR 还没添加 changeset 记录哦」,防止忘记更新日志。
- 搭配快捷指令(Alias):
把
alias cs="pnpm changeset"加入你的~/.zshrc,改完代码直接终端敲cs,极致丝滑!
总结
这套方案打通后,团队协作的发版阻力几乎降为零:
- 开发者:只专注于写代码 + 随手
pnpm changeset说明改动。 - Maintainer:只负责在 GitHub 上审阅代码和点击「Merge Release PR」。
如果你还在为 Monorepo 的多包发版焦头烂额,赶紧把 Changesets 引入你的项目试一下吧!绝对是提升前端工程化幸福感的降维打击神器 🐾!
许可协议:CC BY-NC 4.0
更新于 18 小时前
觉得文章有帮助?点个赞吧!
0 条评论


