release-it和changeset对比
当然!下面是 release-it 和 changeset 的对比,以表格形式展示:
| 特性 | release-it | changeset |
|---|---|---|
| 适用场景 | 自动化发布(Git、npm) | Monorepo 多包变更管理 |
| 版本管理 | 自动推测版本号(基于 Conventional Commits) | 手动创建变更记录,控制版本更新 |
| 适合项目 | 单个 package | 多个 package(Monorepo) |
| Changelog | 自动生成(基于 commit) | 根据 changeset变更手动管理 |
| Git 提交 | 自动创建 commit、tag,并推送 | 需要手动 git commit变更记录 |
| 发布方式 | 一键发布(Git + npm) | 先 version,再 publish |
| 自动化程度 | 🚀🚀🚀(全自动) | 🚀(手动控制变更,更精细) |
| 适合团队 | 适合单人开发或小团队 | 适合多人协作,避免错误的版本推测 |
✅ 如何选择?
- 单包项目 ➝
release-it🏆 - Monorepo(多个 package) ➝
changeset🏆 - 希望自动化 Git + npm 发布 ➝
release-it - 希望手动控制每次版本变更 ➝
changeset
如果你的项目是 Monorepo + pnpm,推荐 Changesets!👍
release-it 使用
release-it 是一个强大的 自动化发布工具,可以完成 Git 提交 + 生成 tag + 生成 Changelog + npm 发布,适用于单个 package 的管理。
1️⃣ 安装
pnpm add release-it -D
或者使用 npx 直接运行(无需安装):
npx release-it
2️⃣ 快速开始
默认情况下,release-it 会:
✅ 询问你要发布的新版本(自动推测 semver)
✅ 更新 package.json 版本号
✅ 生成 Git commit 并创建 tag
✅ 生成 CHANGELOG.md(基于 Conventional Commits)
✅ 推送 Git commit 和 tag
✅ 发布到 npm(如果启用了 npm publish)
执行:
pnpm release-it
然后按照提示输入新版本号,它会自动完成所有操作。
3️⃣ 配置 release-it
可以创建 .release-it.json 或 .release-it.js 来自定义行为:
示例:最小配置
📄 .release-it.json
{
"git": {
"tagName": "v${version}",
"commitMessage": "chore(release): v${version}",
"push": true
},
"npm": {
"publish": true
}
}
🔹 tagName: Git 标签格式,例如 v1.2.3
🔹 commitMessage: 版本提交信息
🔹 push: 是否自动推送 Git 变更
🔹 publish: 是否自动发布到 npm
4️⃣ 高级用法
🔹 4.1 指定发布版本
手动指定版本号:
pnpm release-it 1.2.3
使用 major、minor、patch:
pnpm release-it minor
示例:
| 命令 | 结果(假设当前版本 1.0.0) |
|---|---|
pnpm release-it major | 2.0.0 |
pnpm release-it minor | 1.1.0 |
pnpm release-it patch | 1.0.1 |
🔹 4.2 只执行部分任务
如果只想 创建 tag,不发布:
pnpm release-it --no-npm
如果只想 发布到 npm,不推送 Git:
pnpm release-it --no-git
🔹 4.3 使用 Hooks
可以在不同阶段执行额外的命令,比如运行测试: 📄 .release-it.json
{
"hooks": {
"before:init": "pnpm test",
"before:git:release": "echo Releasing new version!"
}
}
🔹 before:init: 运行测试
🔹 before:git:release: 版本发布前执行命令
🔹 4.4 自动生成 CHANGELOG
可以结合 conventional-changelog 自动生成:
pnpm add conventional-changelog -D
📄 .release-it.json
{
"plugins": {
"@release-it/conventional-changelog": {
"preset": "angular"
}
}
}
然后执行:
pnpm release-it
它会自动分析 Git commit 并生成 CHANGELOG.md。
5️⃣ 结合 CI/CD 自动化
在 GitHub Actions 中,可以用 release-it 自动发布:
📄 .github/workflows/release.yml
name: Release
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: latest
- run: pnpm install
- run: pnpm release-it
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
📌 注意:
🔹 需要在 GitHub Secrets 配置 GITHUB_TOKEN 和 NPM_TOKEN
🔹 当 main 分支有变更时,会自动发布新版本
changeset 使用
1️⃣ 安装 changesets
如果你还没有安装 changesets,可以在 monorepo 根目录执行:
pnpm add -D @changesets/cli
然后初始化:
npx changeset init
它会创建 .changeset 目录,并生成 config.json,默认情况下 changesets 只会更新有变更的 package。
2️⃣只更新某个 package
当你只想更新某个包(如 packages/foo),可以执行:
npx changeset
然后:
- 选择要更新的 package(比如
packages/foo)。 - 选择版本类型:
-
patch(修订版,比如1.0.0 → 1.0.1)minor(次版本,比如1.0.0 → 1.1.0)major(主版本,比如1.0.0 → 2.0.0)
这会在 .changeset/ 目录下生成一个变更文件(如 random-id.md),里面记录了要更新的 package 和版本号。
3️⃣ 仅更新该 package 版本
执行:
npx changeset version
它只会更新 package.json 的版本号,并不会发布。
更新后的 package.json 示例:
{
"name": "foo",
"version": "1.0.1",
"dependencies": {}
}
4️⃣只发布该 package
npx changeset publish
- 默认情况下,
changeset publish只会发布 版本号有变更的 package,其他 package 不会被影响。 - 这一步相当于执行
pnpm publish,并自动处理dependencies的版本更新。