Go 1.11+模块机制已取代GOPATH和vendor,迁移必须设GO111MODULE=on、显式go mod init指定域名路径、删旧vendor/与锁文件、提交go.sum、私有模块配GOPRIVATE。

Go 1.11+ 的模块机制已完全取代 GOPATH 和 vendor,迁移时若仍沿用旧习惯(如手动设 GOPATH、依赖 godep、保留 vendor/ 而不配 go mod vendor),反而会导致构建失败、IDE 标红、CI 不一致等实际问题。
GO111MODULE=on 是迁移前提,不是可选项
Go 1.16+ 默认开启,但旧系统或 Docker 构建环境可能仍是 auto。一旦项目根目录有 go.mod,而 GO111MODULE=auto 且当前路径在 $GOPATH/src 下,Go 工具链会退回到 GOPATH 模式,忽略 go.mod。
- 检查方式:
go env GO111MODULE,必须为on - 强制启用:
go env -w GO111MODULE=on(用户级)或在 CI 脚本开头加export GO111MODULE=on - 误设
GO111MODULE=off会导致go run报错no Go files in current directory,即使有main.go
go mod init 必须显式指定 module path
在任意目录下直接运行 go mod init 会尝试从路径推导 module 名,比如 /home/user/myproj → myproj,这种无域名前缀的 name 无法被其他模块正确 import,也容易和标准库冲突。
- 正确做法:
go mod init example.com/myapp(域名无需真实存在,仅作命名空间) - 初始化后立刻检查
go.mod第一行是否为你写的完整路径;若不对,直接编辑修改,再执行go mod tidy - 已有
vendor/目录时,先rm -rf vendor/ Gopkg.lock Godeps/再 init,否则go mod tidy可能漏掉依赖
go.sum 必须提交,且不能靠 IDE 自动修复
go.sum 是模块校验和清单,每次 go mod download 或 go mod tidy 都会更新它。若未提交,不同机器上拉取同一 tag 可能因 proxy 缓存或网络差异拿到不同 zip,导致构建结果不一致。
立即学习“go语言免费学习笔记(深入)”;
- 常见错误:Git 忽略
go.sum,或 CI 构建时用go mod download却跳过go.sum校验 -
go build会自动校验go.sum,若校验失败报错checksum mismatch,此时不能删go.sum重来,而应查清是哪次go get引入了脏包 - 私有模块需配合
GOPRIVATE=git.example.com,否则go.sum里会写入 proxy 域名而非原始 Git 地址,造成校验失效
依赖下载位置变了,别再找 vendor/ 或 $GOPATH/src
Go Modules 下,依赖包默认存在 $GOCACHE/pkg/mod(如 $HOME/Library/Caches/go-build),结构是 cache/pkg/mod/sumdb/sum.golang.org/...,不是 vendor/,也不是 $GOPATH/src。试图在这些旧路径下找包,只会浪费时间。
-
go mod download只填充缓存,不生成vendor/;要生成 vendor 目录,必须显式运行go mod vendor -
go list -m all可查看当前解析出的所有模块及版本,比翻go.mod更直观 - IDE(如 GoLand)依赖
go list输出做索引,若终端中go list -m all正常但 IDE 仍标红,大概率是 GoLand 设置里没勾选Enable Go Modules integration
真正麻烦的不是命令记不住,而是旧项目残留的 GOPATH 设置、export GOPATH= 脚本、vendor/ 目录和 Godeps.json 文件混在一起——它们不会报错,但会让 go mod tidy 行为不可预测,直到某次 CI 构建突然失败才暴露出来。


















