Skip to content

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正常提升版本
代码无变更❌ 拒绝提升,并提示用户仅对实际变更的集合操作

例如,项目有 cliweb 两个集合,webpaths = ["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 提交 / 打标签 / 推送,不会提升版本号

发布标准流程:

  1. gvt bump --set cli --minor(提升版本号,修改源文件)
  2. gvt release --set cli(读取新版本号,commit / tag / push)

基于 MIT 协议开源