如何让Go模块在发布时自动生成tag_Go发布流程说明

Go模块发布必须使用带v前缀的语义化版本tag(如v1.2.0),手动或脚本打tag后推送至远程,再通过go list和go get验证可引用性。

发布前确保模块版本语义化

Go 模块的 tag 必须符合 语义化版本(SemVer)格式,例如 v1.2.0v0.5.3。不能是 1.2.0(缺 v 前缀)或 release-1.2(非标准)。Go 工具链(如 go list -m -versionsgo get)只识别带 v 前缀的合法 SemVer tag。

手动打 tag 是最直接可靠的方式

自动生成 tag 并非 Go 内置能力,需借助 Git 和脚本配合。推荐在本地或 CI 中执行:

  • 确认当前代码已测试通过、go mod tidy 无变更、go build 成功
  • 更新 go.mod 中的模块路径(如有必要),但版本号不在此文件中体现
  • 运行命令打 tag:git tag v1.2.0
  • 推送 tag 到远程:git push origin v1.2.0git push origin --tags

可选:用脚本自动推导并创建 tag

若希望减少人工判断,可用简单 Bash 脚本辅助(例如基于上次 tag 自增 patch):

  • 获取最新 tag:git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0"
  • 解析并递增版本(如用 awksed),生成新 tag 如 v0.1.1
  • 校验格式合法性(是否匹配 ^v[0-9]+\.[0-9]+\.[0-9]+$
  • 执行 git taggit push

注意:自动递增仅适合 patch 级发布;主/次版本升级仍需人工确认兼容性。

发布后验证模块是否可被正常引用

tag 推送后,等几秒至几分钟(GitHub/GitLab 同步延迟),即可验证:

  • 运行 go list -m -versions your/module/path 查看是否列出新 tag
  • 新建测试项目,执行 go get your/module/path@v1.2.0 确认能拉取
  • 检查 go.mod 中是否写入了正确版本,且 go.sum 更新无误

基本上就这些。不复杂但容易忽略 v 前缀和推送步骤,导致下游无法感知新版本。