go.sum 在 go mod init 后不会立即生成,仅在首次执行 go build、go test 或 go list 等触发依赖解析的命令时创建;若初始化后直接提交易致 CI 构建失败,应运行 go build ./... 或 go list -m all 生成。

go mod init 之后为什么 go.sum 没生成?
执行 go mod init example.com/myapp 只会创建 go.mod,不会自动生成 go.sum——它只在首次运行 go build、go test 或 go list 等触发依赖解析的命令时才写入。如果你初始化后直接看目录,go.sum 确实不存在,这正常。
常见误操作是 init 后立刻提交代码,结果 CI 构建失败,报错类似 missing go.sum。解决方法很简单:跑一次 go build ./... 或 go list -m all,go.sum 就会落地。
go mod tidy 报 “no required module provides package” 怎么办?
这个错误本质是 import 路径和模块路径不匹配。比如你在 main.go 里写了 import "github.com/sirupsen/logrus",但本地没执行过 go get github.com/sirupsen/logrus,或 go.mod 里没记录该模块,go mod tidy 就会卡住。
- 先确认 import 路径拼写正确(注意 sirupsen 不是 sirupsem)
- 手动拉一次:运行
go get github.com/sirupsen/logrus@v1.9.3(指定版本更稳) - 再执行
go mod tidy,它会自动补全require行并更新go.sum - 如果项目有 replace,检查
replace是否覆盖了本应存在的模块路径
如何让 Go Modules 正确识别本地依赖(比如同一工作区的子模块)?
不用 push 到远程也能复用本地代码,关键是用 replace 指向文件系统路径。例如你有两个模块:example.com/app 和 example.com/lib,且 lib 还没发布:
立即学习“go语言免费学习笔记(深入)”;
go mod edit -replace example.com/lib=../lib
这条命令会在 go.mod 中插入一行 replace example.com/lib => ../lib。注意:
-
../lib必须包含有效的go.mod文件 - 路径是相对当前
go.mod的位置,不是 GOPATH - CI 环境中要确保该路径存在,否则构建失败;上线前建议改回真实版本号并删掉
replace
GO111MODULE=on 是不是必须设置?
Go 1.16+ 默认开启 modules,GO111MODULE 环境变量已基本废弃。只有两种情况需要干预:
- 你在 GOPATH/src 下开发老项目,又不想迁移,可设
GO111MODULE=off强制走 GOPATH 模式(不推荐) - 你想临时禁用 modules 调试某些兼容问题,设
GO111MODULE=auto让 Go 自己判断(但实际行为和on几乎一致)
绝大多数新项目只需确保:项目根目录有 go.mod,且不在 GOPATH/src 内——其余交给 Go 自动处理。硬设 GO111MODULE=on 不仅多余,还可能掩盖路径配置问题。
模块路径命名不是随便起的,它最终影响 import 语句和 proxy 缓存。比如用 go mod init mytool 初始化,后续所有 import 都得写 import "mytool/utils",而 Go Proxy 也会按这个路径去查版本。很多人忽略这点,导致换机器后 go get 失败或引入错误副本。










