先删Gopkg.lock等旧文件,再显式执行go mod init github.com/your-org/your-repo;若用gopkg.in需加replace修复;避免vendor干扰,CI须配置GOPROXY和GOSUMDB。

go mod init 报 unknown revision 怎么办
直接运行 go mod init 失败,常见报错是 unknown revision v1.2.3 或 module declares its path as ... but was required as: gopkg.in/xxx.v1,本质是 dep 留下的 Gopkg.lock 仍在干扰解析。
必须先清理再初始化:
- 删掉
Gopkg.lock和Gopkg.toml(如果存在) - 别依赖自动推导路径:显式执行
go mod init github.com/your-org/your-repo,模块名必须和代码里import的路径一致 - 若项目中用了
gopkg.in/yaml.v2这类重定向导入,初始化后手动加replace行到go.mod,例如:replace gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.4.0 - 执行
go list -m all,看输出里有没有大量// indirect条目——有就说明旧 vendor 或缓存残留,得清掉$GOPATH/pkg/mod/cache或用go clean -modcache
vendor 目录要不要保留、怎么用才不翻车
不是“要不要”,而是“什么时候必须禁用”。Go Modules 默认走代理+校验机制,vendor/ 是可选的兜底方案,不是默认路径。
除非你的 CI 环境完全断网且已配置私有 GOPROXY 和 GOSUMDB,否则别生成 vendor/。
立即学习“go语言免费学习笔记(深入)”;
如果非得保留:
- 生成前先
go mod tidy确保go.mod和go.sum准确,再跑go mod vendor - 构建时必须显式加
-mod=vendor参数,例如go build -mod=vendor;漏写就会走 module 模式,行为不一致 - 检查
vendor/modules.txt里是否混着// indirect——这是 dep 时代残留信号,得用go mod graph | grep定位并手动删掉未被 import 的间接依赖 -
.gitignore里加/vendor,且所有成员禁用GO111MODULE=off
CI 流水线里 go get -u 失败或 checksum mismatch
这不是网络问题,是 Go Modules 在验证阶段默认启用 GOSUMDB 和 GOPROXY,而旧脚本没设值。
必须在 CI 环境里显式配置:
-
GOPROXY=https://proxy.golang.org,direct(或你自己的私有 proxy) -
GOSUMDB=sum.golang.org(若内网无法访问,设为off,但需确保go.sum已提交且可信) - 删掉所有
go get安装工具的命令(比如go get golang.org/x/lint/golint),改用go install golang.org/x/lint/golint@latest(Go 1.17+ 语法) - Docker 构建时,确认基础镜像 Go 版本 ≥ 1.16(
GO111MODULE默认 on),且源码目录下已有go.mod;否则go build会退化成 GOPATH 模式并报no Go files in
迁移后本地 go run 正常但测试失败
最常被忽略的是测试文件里的隐式依赖 —— _test.go 中 import 的包,go mod vendor 默认不收录,因为 go list -deps ./ 不扫描测试代码。
验证方式:
- 运行
go list -f '{{if not .Indirect}}{{.ImportPath}}{{end}}' -deps ./... | grep test,看是否有测试专用依赖没进go.mod - 手动补上缺失的
go get,再go mod tidy - 如果原
vendor/里有 fork 分支(如github.com/user/pkg@my-fork),go mod vendor会按go.mod记录的 commit 拉取,可能丢定制逻辑;得用replace显式指向 fork 地址和分支 - 留意
//go:embed或cgo所需的非 Go 文件,go mod vendor不复制它们,得单独处理
replace 没写对路径、或者 CI 里还留着 go get 老习惯。每个 go mod 命令背后都有明确作用域,混用 vendor 和 module 模式时,参数漏一个 -mod= 就足以让构建结果不可复现。


















