go111module=on 必须显式设置,否则在 ci 或非 gopath 路径下易因 auto 模式识别失败导致构建报错;goproxy 和 goprivate 也需正确配置以支持国内镜像与私有模块拉取。

GO111MODULE=on 必须显式设置,不能依赖默认
Go 1.16+ 虽然默认启用 Modules,但实际行为仍受 GO111MODULE 环境变量控制。很多 CI 镜像、Docker 容器或旧终端配置里它仍是 auto,导致在 /tmp 或非 GOPATH 路径下执行 go build 直接报错:no required module provides package。
原因在于 auto 模式依赖路径判断——比如你在 /tmp/myapp 初始化项目,它可能根本识别不了这是个模块;而设为 off 则彻底禁用模块机制,go mod tidy 会报 not in a module。
- 执行
go env -w GO111MODULE=on是最稳妥的全局设定,比 shell export 更可靠(永久生效) - Windows PowerShell 用户别用
$env:GO111MODULE="on",那只影响当前会话 - 验证是否生效:运行
go env GO111MODULE,输出必须是on
go mod init 后必须立刻 go mod tidy
go mod init example.com/myproject 只生成空的 go.mod,不下载任何依赖,也不校验 import 是否完整。此时直接 go run main.go 很可能失败,因为间接依赖没拉取、go.sum 为空。
常见错误是手动往 go.mod 里硬写 require 行——go mod tidy 下次执行就会把它删掉,Go 不认这种“人工编辑”。
-
go mod tidy扫描全部.go文件中的import,补全直接/间接依赖,并更新go.sum - 如果项目已有
vendor/目录,go mod tidy默认忽略它;需加-v参数才清理冗余内容 - 模块路径(
example.com/myproject)必须合法:不能含空格、中文、下划线开头,也不能是本地路径如./myproject
GOPROXY 必须配国内镜像,且带 ,direct
默认 GOPROXY=https://proxy.golang.org 在国内基本不可用,常报 Get "https://proxy.golang.org/": dial tcp: i/o timeout,直接卡死 go get 或 go mod tidy。
只设代理地址还不够——没加 ,direct 的话,私有仓库(如 git.internal.company.com/lib/foo)也会被代理转发,结果是 401 或 404,然后整个命令失败。
- 推荐配置:
go env -w GOPROXY=https://goproxy.cn,direct -
,direct表示:对匹配GOPRIVATE的域名,跳过代理直连 - 验证:
go env GOPROXY应输出完整字符串,不是空或默认值
GOPRIVATE 必须设置私有模块域名
没设 GOPRIVATE 时,Go 会尝试用 GOPROXY 拉取私有仓库,比如 git.internal.company.com/lib/foo,结果不是 404 就是 401,报错:module git.internal.company.com/lib/foo: reading ...: 401 Unauthorized。
注意 GOPRIVATE 不是开关,而是白名单列表,支持通配符,但必须显式声明。
- 设单个域名:
go env -w GOPRIVATE=git.internal.company.com - 设多个:
go env -w GOPRIVATE="git.internal.company.com,github.com/myorg" - 支持通配符:
go env -w GOPRIVATE="*.company.com" - 设完后,
go mod tidy才能正常拉取私有模块并写入go.mod
go.mod,后续改 import 路径或重构时,必须同步更新 module 行,否则会出现 import path does not contain a dot 或版本解析混乱——这点最容易被忽略,等 CI 报错才发现。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











