gvt bump — 按版本集合提升版本号
取代旧的 scripts/bump_version.py,采用「配置集合」模型:每个版本号是一个 .gvt/version/<name>.toml 集合文件,自包含声明当前版本来源与待更新文件清单。命令只更新集合中明确列出的文件,不做全量扫描。
用法
bash
gvt bump --set cli --patch # 仅更新 cli 集合,patch +1
gvt bump --set cli --minor # cli 集合,minor +1
gvt bump --set cli --target 1.0.0 # 将 cli 集合指定为 1.0.0
gvt bump --set cli --set web --minor # 同时更新 cli 与 web 两集合
gvt bump --patch # 仅一个集合时可省略 --set
gvt bump --dry-run # 仅预览,不写入
gvt bump ls # 列出所有集合及其当前版本参数
| 参数 | 简写 | 说明 |
|---|---|---|
--set | -s | 指定要更新的版本集合(可重复;多个集合时必须指定,仅一个时可省略) |
--target | 指定目标版本号 x.y.z(与 --patch/--minor/--major 互斥) | |
--patch | 提升 patch 版本号 | |
--minor | 提升 minor 版本号 | |
--major | 提升 major 版本号 | |
--dry-run | -n | 仅预览,不实际写入文件 |
⚡
paths字段:集合配置了paths后,gvt bump会强制检查对应路径下有无未提交代码变更。无变更时拒绝提升版本,防止误操作。
所有参数均为标志参数,不使用位置参数(urfave/cli 在首个位置参数后会停止解析标志)。
版本集合配置
集合文件位于 .gvt/version/<name>.toml:
toml
# .gvt/version/cli.toml
name = "cli"
source = "cmd/gvt/main.go" # 当前版本来源文件(必须出现在 files 中)
paths = ["cmd/", "internal/cmd/", "internal/ui/"] # 功能模块代码路径前缀(可选)
[[files]]
path = "cmd/gvt/main.go"
pattern = 'Version:\s+"(\d+\.\d+\.\d+)"'
[[files]]
path = "internal/ui/ui.go"
pattern = 'v(\d+\.\d+\.\d+)'
[[files]]
path = "README.md"
pattern = '(\d+\.\d+\.\d+)'- 每个
pattern的捕获组(1)必须为待替换的版本号; - 仅当捕获组
(1)精确等于本集合旧版本号时才替换(避免误改依赖版本号); source用于gvt bump ls读取当前版本。paths(可选)声明该版本集合关联的功能模块代码路径前缀。配置后,gvt bump会自动检查这些路径下是否有未提交的代码变更。
代码变更保护
当集合配置了 paths 后,gvt bump 会强制检查对应的功能模块代码是否有变更:
| 场景 | 行为 |
|---|---|
paths 未配置 | 不检查(兼容存量配置) |
代码已变更(匹配 paths) | 正常提升版本 |
| 代码无变更 | ❌ 拒绝提升,并提示用户仅对实际变更的集合操作 |
例如,项目有 cli 和 web 两个集合,web 的 paths = ["frontend/"]。若仅修改了后端代码:
bash
# ❌ 拒绝 — web 代码无变更
gvt bump --set all --patch
# ✅ 正确做法 — 仅提升有变更的集合
gvt bump --set cli --patch目的是防止无变更集合被意外批量提升。
paths配置了就必须有对应的代码变更,否则无法执行。如需调整路径配置,编辑.gvt/version/<name>.toml中的paths字段即可。
与 gvt release 的关系
gvt bump 只做版本号文件替换,是底层能力;gvt release 负责读取版本号并执行 git 提交 / 打标签 / 推送,不会提升版本号。
发布标准流程:
gvt bump --set cli --minor(提升版本号,修改源文件)gvt release --set cli(读取新版本号,commit / tag / push)