Changesets 是面向 JavaScript 单体仓库、基于文件的版本管理与变更日志工具。它的 3.0 版本已经发布,距离上一个主版本 v2 过去了整整七年。

这次更新由重组后的维护团队主导,成员包括 Mateusz Burzyński、Bjorn Lu 和 Adam Haglund,开发过程遵循公开的 v3 发布计划。同步上线的还有全新文档站点,以及配套的 changesets/action v2。这个工具目前每周下载量超过300 万次。

打开网易新闻 查看精彩图片

安装包瘦身:16.1MB 到 2.1MB

最直观的变化是体积。安装包从16.1MB缩减到2.1MB,依赖数量从95 个降到39 个。缩减幅度约 88%。

代价是运行门槛抬高。所有包现在仅支持 ESM,要求 Node.js 22.11 或更高版本;包管理器最低要求 pnpm 10、npm 10.9 或 Yarn 4.5.2,Yarn Classic 不再支持。项目内部也迁移到了 tsdown、rolldown、vitest 和 oxfmt。

变更日志格式化不再捆绑自带的 Prettier,改为通过 @changesets/format 检测项目中已安装的 prettier、oxfmt、deno 或 dprint。

对等依赖:从主版本改成补丁

本次最受关注的行为变更,是对等依赖的更新逻辑。现在给依赖它的下游包打补丁版本,而不是主版本。

旧行为多年来饱受诟病。issue 1011 里,一个维护设计系统单体仓库的团队反馈,自动升级为主版本号"传递了错误的语义,不符合语义化版本的初衷"。如果作者确实要发布重大变更,仍然可以手动为下游依赖包添加显式的主版本变更记录。

新推出的竞品工具 Bumpy 的维护者给出了不同看法,认为 v3"把规则硬编码到了另一个极端"——现在每个对等变更都被假定为非重大变更,而且两个版本都不允许配置传播规则。他们的对比文章认可 v3 解决了很多长期被诟病的老问题,同时列出尚存短板,比如缺少 pnpm catalog 支持,预发布版本的设计逻辑也没有改动。

命令行重构与升级清单

命令行工具基于 cac 重构了参数解析,使用 clack prompts 实现交互功能,同时修复了取消交互式提示时会导致进程崩溃的问题。新增的 pack 和 publish-plan 命令支持 e18e 社区推荐的构建、打包和发布流程,v2 action 暴露了子 action,使用 npm 可信发布的团队可以收紧发布权限。

升级主要是配置层面的工作。除了安装要求,部分命令和参数也做了重命名:

  • changeset tag → changeset git-tag
  • changeset status --sinceMaster → changeset status --since=main
  • 配置项 prettier 字段替换为 format
  • 私有包默认不再进行版本管理,除非手动开启

配置写法上,format 可以设为 auto,privatePackages 则拆成 version 和 tag 两个开关。执行 changeset version 时,如果没有可发布的内容,现在会以退出码 1 终止程序。某个团队的发布手册对此警示:"任何在 set -e 下无条件运行它的脚本现在都会在空发布时失败"。

对比 semantic-release(基于约定式提交自动推断版本)和 release-it,Changesets 保留了独有的取舍设计:由贡献者把发布意图写进 Markdown 文件,发布流程可通过 PR 进行评审。v3 没有改动这套核心模型,只是降低了安装开销,并优化了对等依赖相关的处理逻辑。

Changesets 是 MIT 协议开源工具,用于版本管理和变更日志生成,尤其适用于单体仓库。贡献者声明自己的改动该如何发布,CLI 再把这些声明转换成版本号升级、变更日志条目,以及向包仓库的发布操作。v3 现已正式可用,v2 保留在维护分支上。