如何在Golang中创建模块版本分支_管理不同功能版本

Go模块不同主版本必须用不同路径,如v1为github.com/yourname/project,v2为github.com/yourname/project/v2;小版本共用同一路径,仅靠tag区分,工具链自动解析最新兼容版。

在 Go 中,模块版本分支不是 Git 分支,而是通过 语义化版本(SemVer)+ 模块路径后缀 实现的。Go 官方不支持“在同一仓库用不同 Git 分支发布同一模块的不同主版本”,而是要求:不同主版本(如 v1 → v2)必须使用不同的模块路径(module path),通常通过在 import path 末尾添加 /v2/v3 等实现。

明确模块路径与主版本绑定

Go 的版本管理基于模块路径唯一性。例如:

  • github.com/yourname/project 对应 v0/v1 版本(默认无后缀)
  • github.com/yourname/project/v2 是独立模块,对应 v2.x 系列
  • github.com/yourname/project/v3 同理,不可与 v2 共享同一路径

这是强制约定,否则 go 命令会报错:invalid version: module contains a go.mod file, so major version must be compatible

创建 v2 分支并初始化新模块

假设当前主干是 v1,要开发不兼容的 v2 功能:

  • 从 main(或 v1 tag)拉出新 Git 分支,如 git checkout -b release/v2
  • 进入项目根目录,修改 go.mod 第一行:
    module github.com/yourname/project/v2
  • 运行 go mod tidy 自动更新依赖路径(所有内部 import 也要改成 github.com/yourname/project/v2/xxx
  • 提交并打 tag:git tag v2.0.0 && git push origin v2.0.0

让 v1 和 v2 并行维护

两个版本可独立迭代:

  • v1 修复 bug:切回 mainv1-maintenance 分支,保持 module github.com/yourname/project,发 v1.1.1 tag
  • v2 开发新功能:在 release/v2 分支上开发,发 v2.1.0 tag
  • 用户按需导入:import "github.com/yourname/project"import "github.com/yourname/project/v2"

注意:v2 模块内不能直接 import v1 路径,反之亦然 —— 它们是逻辑隔离的模块。

小版本和补丁版本无需新路径

v2.0.0、v2.1.0、v2.1.1 属于同一主版本,全部使用 github.com/yourname/project/v2 路径,仅靠 tag 区分。Go 工具链自动解析最新兼容版本(如 go get github.com/yourname/project/v2@latest)。

不复杂但容易忽略。