必须设为on,因auto模式依赖路径判断不可靠(如/tmp下不识别模块),off模式则完全禁用模块功能,导致go mod命令失效、依赖无法管理;显式启用才能确保模块机制稳定运行。

GO111MODULE 必须设为 on,否则 go mod 命令不会生效,项目仍会 fallback 到旧的 GOPATH 模式。
为什么必须显式设置 GO111MODULE=on
Go 1.16+ 默认启用 Modules,但部分旧环境(如某些 CI 镜像、Docker 容器或未更新 shell 配置的本地终端)仍可能沿用 auto 模式。一旦当前目录不在 GOPATH/src 下且无 go.mod,go build 就会报错:no required module provides package。
-
GO111MODULE=auto的行为依赖路径判断,不可靠 —— 比如你在/tmp/myapp初始化项目,它可能直接拒绝识别为模块 -
GO111MODULE=off会完全禁用 Modules,强制走 GOPATH,导致go get不写入go.mod,go mod tidy报错 “not in a module” - 执行
go env -w GO111MODULE=on是最稳妥的全局设定,无需每次 cd 进项目都检查
GOPROXY 设置国内镜像避免超时失败
默认 GOPROXY 是 https://proxy.golang.org,国内直连常出现 Get "https://proxy.golang.org/...": dial tcp: i/o timeout,进而阻断 go get 或 go mod tidy。
- 推荐设为
https://goproxy.cn,direct或https://mirrors.aliyun.com/goproxy/,direct -
,direct表示:对私有模块(如公司内网 Git)跳过代理,直接拉取;没有它,私有仓库会因 404 或认证失败中断 - 设置命令:
go env -w GOPROXY=https://goproxy.cn,direct - 验证是否生效:
go env GOPROXY应输出对应地址
go mod init 后立即运行 go mod tidy
go mod init 只生成空的 go.mod,不下载任何依赖,也不校验一致性。若此时直接 go build,很可能因缺失间接依赖而失败。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
go mod tidy会扫描全部import,补全直接/间接依赖,并同步更新go.sum - 常见误操作:手动编辑
go.mod添加require行 —— Go 不认这种“硬写”,后续go mod tidy会把它删掉 - 如果项目已有 vendor 目录,
go mod tidy默认忽略它;需加-v参数才清理 vendor 冗余内容
私有模块必须配置 GOPRIVATE
没配 GOPRIVATE 时,Go 会尝试用 GOPROXY 拉取私有仓库(如 git.internal.company.com/lib/foo),结果是 404 或 401,然后报错:module git.internal.company.com/lib/foo: reading git.internal.company.com/lib/foo/go.mod at revision v0.1.0: 401 Unauthorized。
立即学习“go语言免费学习笔记(深入)”;
- 设置方式:
go env -w GOPRIVATE="git.internal.company.com,github.com/myorg" - 支持通配符:
go env -w GOPRIVATE="*.internal.company.com" - 配置后,Go 会跳过 proxy 和 sumdb 校验,改用 git clone + SSH/HTTPS 凭据拉取
- 注意:仅设
GOPRIVATE不够,还需确保本地 git 能正常访问对应地址(比如已配置 SSH key 或 HTTPS token)
go mod tidy 看似简单,但它实际在做 import 分析、版本解析、checksum 校验三件事。漏掉任意一环,就可能出现本地能跑、CI 失败,或不同人构建出不同二进制的情况。

















