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 功能:
立即学习“go语言免费学习笔记(深入)”;
- 从 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:切回
main或v1-maintenance分支,保持module github.com/yourname/project,发v1.1.1tag - v2 开发新功能:在
release/v2分支上开发,发v2.1.0tag - 用户按需导入:
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)。
不复杂但容易忽略。










