本文档对比了三个主流的 Node.js 版本管理工具:semantic-release、standard-version 和 Changesets,帮助开发者根据项目需求选择合适的工具。
| 特性 | semantic-release | standard-version | Changesets |
|---|---|---|---|
| 自动化程度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 学习曲线 | 中等 | 低 | 中等 |
| Monorepo 支持 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 手动控制 | 低 | 高 | 中 |
| CI/CD 集成 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 配置复杂度 | 高 | 低 | 中 |
| 社区活跃度 | 高 | 中 | 高 |
| 维护状态 | 活跃 | 维护模式(作者已建议迁移至 release-please) | 活跃 |
提交代码 → CI 触发 → 自动分析 → 自动发布 → 自动创建 Release
↓ ↓ ↓ ↓ ↓
Developer CI/CD Analyze Publish GitHub Release特点:
提交代码 → 手动触发 → 自动分析 → 手动推送 → 手动发布
↓ ↓ ↓ ↓ ↓
Developer Command Analyze Push npm publish特点:
提交代码 → 创建变更集 → 合并 PR → 自动创建 Version PR → 合并后自动发布
↓ ↓ ↓ ↓ ↓
Developer Changeset Merge PR Version PR Auto Publish特点:
基于提交信息自动计算:
feat: add feature → 1.0.0 → 1.1.0 (Minor)
fix: fix bug → 1.0.0 → 1.0.1 (Patch)
feat!: breaking → 1.0.0 → 2.0.0 (Major)基于提交信息自动计算:
feat: add feature → 1.0.0 → 1.1.0 (Minor)
fix: fix bug → 1.0.0 → 1.0.1 (Patch)
BREAKING CHANGE → 1.0.0 → 2.0.0 (Major)基于变更集文件手动指定:
---
"package-name": minor
---
描述信息// 需要额外配置
plugins: [
['@semantic-release/exec', {
prepareCmd: 'lerna version ${nextRelease.version}',
publishCmd: 'lerna publish from-package'
}]
]评分:⭐⭐⭐
# 需要在每个包中单独运行
cd packages/core
npx standard-version评分:⭐⭐
{
"fixed": [["@myorg/ui", "@myorg/theme"]],
"linked": [["@myorg/core", "@myorg/utils"]]
}评分:⭐⭐⭐⭐⭐(专为 Monorepo 设计)
@semantic-release/changelog 插件# GitHub Actions
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}特点:原生支持,配置简单
# GitHub Actions
- run: npx standard-version
- run: git push --follow-tags origin main
- run: npm publish特点:需要额外配置发布步骤
# GitHub Actions
- uses: changesets/action@v1
with:
publish: pnpm release特点:官方 Action,配置简单
✅ 推荐使用:
❌ 不推荐使用:
✅ 推荐使用:
❌ 不推荐使用:
✅ 推荐使用:
❌ 不推荐使用:
开始选择
↓
是否是 Monorepo 项目?
├─ 是 → 使用 Changesets
└─ 否 → 需要完全自动化发布?
├─ 是 → 使用 semantic-release
└─ 否 → 需要手动控制发布时机?
├─ 是 → 使用 standard-version
└─ 否 → 使用 semantic-releasepnpm add semantic-release @semantic-release/changelog @semantic-release/git -D
pnpm remove standard-version// .releaserc.js
module.exports = {
branches: ['main'],
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/changelog',
'@semantic-release/npm',
'@semantic-release/git',
'@semantic-release/github'
]
}# 删除手动发布步骤,替换为
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}保留现有 CHANGELOG.md,semantic-release 会在顶部追加新版本。
pnpm add @changesets/cli -D
pnpm remove semantic-release @semantic-release/*npx changeset init// .changeset/config.json
{
"access": "public",
"baseBranch": "main"
}# 开发流程
npx changeset # 创建变更集
git add .changeset/
git commit -m "feat: add feature"
# 发布流程
npx changeset version # 更新版本
npx changeset publish # 发布pnpm add @changesets/cli -D
pnpm remove standard-versionnpx changeset init主要变化:
使用 Conventional Commits 规范
feat: add feature
fix: fix bug
docs: update docs保护主分支
配置 CI/CD
维护 CHANGELOG
// 1. 使用完整插件链
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/changelog',
'@semantic-release/npm',
'@semantic-release/git',
'@semantic-release/github'
]
// 2. 配置分支策略
branches: [
'main',
{ name: 'beta', prerelease: true },
{ name: 'alpha', prerelease: true }
]
// 3. 使用 dry-run 验证
npx semantic-release --dry-run// 1. 配置提交类型
types: [
{ type: 'feat', section: 'Features' },
{ type: 'fix', section: 'Bug Fixes' }
]
// 2. 使用 npm scripts
{
"release": "standard-version",
"release:minor": "standard-version --release-as minor"
}
// 3. 配合 husky 和 commitlint
// 强制规范提交信息// 1. 配置 Monorepo 策略
{
"fixed": [["@myorg/ui", "@myorg/theme"]],
"linked": [["@myorg/core", "@myorg/utils"]],
"ignore": ["@myorg/docs"]
}
// 2. 使用 GitHub Action 自动化
// 3. 每个变更创建变更集
// 4. 详细描述 breaking changes简单决策:
不推荐。 每个工具都有自己的版本管理逻辑,同时使用会导致冲突。
semantic-release 和 standard-version:
Changesets:
semantic-release:
{
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/changelog',
'@semantic-release/npm',
'@semantic-release/git'
]
}standard-version: 正常使用,无需特殊配置。
Changesets:
{
"access": "restricted"
}所有工具都建议:
npm deprecate 标记问题版本| 项目类型 | 推荐工具 | 理由 |
|---|---|---|
| Monorepo 项目 | Changesets | 专为 Monorepo 设计,支持多包管理 |
| 开源单包项目 | semantic-release | 全自动化,适合持续发布 |
| 小型私有项目 | standard-version | 简单易用,手动控制 |
| 企业级项目 | Changesets | 变更可追溯,流程可控 |
初学者 → standard-version(学习基础概念)
↓
进阶 → semantic-release(掌握自动化)
↓
高级 → Changesets(精通 Monorepo)记住:没有最好的工具,只有最适合的工具。 根据项目特点、团队规模和发布频率选择合适的版本管理工具。