Go模块v2版本必须将module路径声明为/v2后缀,代码置于/v2子目录,import路径同步更新,tag打在正确提交且格式为v2.0.0,三者缺一不可。

module路径必须带/v2后缀,否则go get根本认不出v2版本
Go模块系统不靠tag自动推断主版本号,它只看go.mod第一行的module声明。如果写成module github.com/user/lib,哪怕你打了v2.0.0标签,go get github.com/user/lib@v2.0.0也会失败,报unknown revision v2.0.0或静默 fallback 到 latest commit。
真正生效的写法只有一种:module github.com/user/lib/v2。这个/v2不是可选后缀,是模块身份的一部分——Go会把它当做一个全新模块看待,和github.com/user/lib完全无关。
- 不能写
module github.com/user/lib/v2.0或module github.com/user/lib/v2.0.0,版本号只能出现在tag里,路径里只留主版本号 - 路径大小写敏感:写成
/V2或/v2/(多一个斜杠)都会导致cannot find module - 私有仓库还要确认
GOPRIVATE已包含该域名,否则/v2路径可能被代理拦截
代码必须放在/v2子目录下,且import路径要和磁盘结构严格对齐
Go要求导入路径与文件系统路径一一对应。声明了module github.com/user/lib/v2,那所有源码就得放在lib/v2/这个本地目录里,不能还在lib/根目录下硬改go.mod。
常见错误是把v2代码留在原目录,靠replace临时指向本地路径测试——这在go build时能过,但go mod tidy会警告,别人go get时直接失败。
-
lib/v2/pkg/→ import路径就是github.com/user/lib/v2/pkg -
lib/v2/internal/→ import路径是github.com/user/lib/v2/internal,不能漏掉/v2 - 如果项目有
go.work,里面use的也得是lib/v2目录,不是lib
所有import语句必须手动更新,go mod tidy不会帮你改代码
go mod tidy只会修正go.mod里的require行,比如把github.com/user/lib v1.5.0换成github.com/user/lib/v2 v2.0.0。但它绝不会动你的源码——所有import "github.com/user/lib"都得你亲手替换成import "github.com/user/lib/v2",包括内部包之间的引用。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
漏改一处就会编译失败:cannot find package "github.com/user/lib",因为Go现在只认/v2路径。
- 用
grep -r 'github.com/user/lib"' ./ --include='*.go'全量扫描,别信IDE全局替换(可能漏test或vendor) - 子包如
github.com/user/lib/client要改成github.com/user/lib/v2/client,不是github.com/user/lib/v2就完事 - 如果用了
go:generate脚本,检查生成代码里有没有硬编码的老路径
tag必须是v2.0.0格式,且得打在/v2目录已就位的提交上
Git tag格式不对,或者打在错的commit上,go list -m -versions github.com/user/lib/v2就看不到v2版本。
正确流程是:先确保lib/v2/go.mod已写好module github.com/user/lib/v2,所有代码和import都就位,再打tag。
- 用
git tag -a v2.0.0 -m "v2 release"(必须带-a,轻量tag不被索引) - 推送单个tag:
git push origin v2.0.0,别用git push --tags,容易混入测试tag - 验证远程tag存在:
git ls-remote --tags origin | grep v2 - 清除本地缓存再试:
go clean -modcache && go list -m -json github.com/user/lib/v2@v2.0.0
目录结构、路径、tag三者必须同步到位,缺一不可。最容易被忽略的是:v2代码没挪进/v2子目录,却以为改了go.mod就能发布——这种“半吊子v2”会让所有人拉不到正确版本。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










