Go Modules 与 GOPROXY 是什么
Go Modules 是 Go 的依赖管理机制:go.mod 声明模块路径、依赖与版本,go.sum 记录依赖内容的校验和。GOPROXY 决定从哪里下载模块(可指定多个源用逗号串联,direct 表示直连 VCS);私有模块用 GOPRIVATE(以及更细的 GONOPROXY / GONOSUMDB)排除在公共代理与校验库之外,避免请求外发失败或泄露内部路径。
基本信息
| 文件 | go.mod(require/版本)、go.sum(校验和) |
|---|---|
| 代理 | GOPROXY(如 https://goproxy.cn,direct) |
| 私有 | GOPRIVATE / GONOPROXY / GONOSUMDB 控制私有模块范围 |
| 只读模式 | -mod=readonly(Go 1.16 起为默认)防止构建改动 go.mod |
典型使用场景
- CI 依赖下载:配置稳定 GOPROXY,避免直连 VCS 受网络与限流影响。
- 私有模块:GOPRIVATE 划出范围,内部模块走内网源、校验库放行。
- 内网/离线构建:自建模块代理(如 Athens 或静态代理)做缓存,断网环境也能构建。
- 版本锁定:go.mod + go.sum 提交入仓,任何机器重建同一版本集。
- 依赖审计:审查 go.sum 与版本升级 PR,掌握引入的传递依赖。
CI 常用设置
CI 常用设置
export GOPROXY=https://goproxy.cn,direct
export GOPRIVATE=git.example.com/internal/*
export GOFLAGS=-mod=readonly
go mod download
go build ./...环境变量速查
| 变量 | 作用 | 说明 |
|---|---|---|
| GOPROXY | 模块下载来源 | 逗号分隔,direct 为直连 |
| GOPRIVATE | 私有模块范围 | 同时设定 GONOPROXY 与 GONOSUMDB 的默认值 |
| GONOPROXY | 跳过代理的模块 | 仅控制代理行为 |
| GONOSUMDB | 跳过校验库的模块 | 私有模块无法被公共校验库覆盖 |
-mod=readonly 防止 CI 因缺失依赖自动改动 go.mod:依赖变更必须显式提交,构建过程保持无副作用。
go.sum 缺条目时构建会失败:本地执行 go mod tidy 更新后随变更一起提交,不要在 CI 里自动补。
CI 缓存 GOMODCACHE(默认位于 GOPATH/pkg/mod)可显著加速下载;注意缓存不等于绕过校验,完整性校验仍会执行。
调试私有分支可用 replace 指令临时替换依赖;合并上线前核对移除,避免构建长期依赖非正式来源。
强离线环境可改用 vendor 目录:依赖随仓库分发,构建完全不访问网络,代价是仓库体积与升级成本。