必须显式设置goprivate,否则私有模块会走公共代理;go默认将所有模块视为公开,需通过go env -w goprivate=domain.com/**等方式声明私有路径,并配合gonoproxy、git认证及可信https证书才能正常拉取。

GOPRIVATE必须显式设置,否则私有模块会走公共代理
Go 默认把所有模块都当成公开的,哪怕你用的是 git.internal.company.com/foo/bar 这种内网地址,只要没告诉 Go “这是私有的”,它就会去 proxy.golang.org 或你配的 GOPROXY 上查——结果当然是 404 或超时。
正确做法是把私有域名加到 GOPRIVATE 环境变量里:
- 单个域名:
go env -w GOPRIVATE=git.internal.company.com - 多个域名用逗号分隔:
go env -w GOPRIVATE=git.internal.company.com,github.company.net - 支持通配符:
go env -w GOPRIVATE="*.company.com"(注意引号,避免 shell 展开)
别只在 shell 里 export GOPRIVATE=...,IDE 或 CI 环境可能读不到;用 go env -w 写入 Go 的配置更可靠。
GONOPROXY不是可选开关,而是和GOPRIVATE配合使用的兜底项
GONOPROXY 和 GOPRIVATE 不是二选一,而是协作关系:GOPRIVATE 告诉 Go “这些模块不走 proxy”,GONOPROXY 则进一步指定“即使没匹配 GOPRIVATE,也别让这些地址走 proxy”——常用于规避某些代理对子路径的误判。
典型场景:
- 你的私有模块路径是
git.internal.company.com/team/project,但代理服务(如 Athens)只认一级路径git.internal.company.com - 此时仅设
GOPRIVATE=git.internal.company.com可能不够,还要加GONOPROXY=git.internal.company.com - 如果用了自建 Athens,且它不支持
/team/project这种三级路径,就得靠GONOPROXY强制直连
注意:GONOPROXY 不会绕过 GOSUMDB 校验,私有模块仍需配 GOSUMDB=off 或自建 sumdb。
私有 Git 仓库必须支持 HTTPS 且证书可信,否则 go mod download 直接失败
Go 工具链从 1.13 起默认禁用 HTTP 模块拉取,所有私有仓库必须走 HTTPS。更关键的是:证书不能是自签名或内网 CA,除非你额外配置了系统级信任。
常见错误现象:
-
go mod download报错:Get "https://git.internal.company.com/...": x509: certificate signed by unknown authority -
git clone https://...能成功,但go mod就不行——因为 Go 不复用 git 的证书配置
解决路径只有两条:
- 给 GitLab/Nexus/自建服务配上阿里云/腾讯云等公开 CA 签发的证书(推荐)
- 若必须用自签名证书,需把 CA 证书加到系统信任库(Linux:/etc/ssl/certs/ca-bundle.crt;macOS:钥匙串),并重启 Go 进程
别试图用 GOINSECURE ——它只对 HTTP 有效,对 HTTPS 无效,设了也没用。
go get 在私有模块下容易误触发模块初始化,导致 go.mod 写错路径
go get 不是“装包命令”,它是模块依赖管理操作。当你在没 go.mod 的目录执行 go get git.internal.company.com/foo/bar,Go 会:
- 先尝试找当前目录或父目录的
go.mod - 找不到就报错:
go get: no modules found(Go 1.16+) - 如果恰好在
$GOPATH/src下运行,它可能降级回 GOPATH 模式,写进错误路径
正确姿势:
- 确保已在项目根目录运行
go mod init example.com/myapp(模块名要合法,别用 IP 或本地路径) - 再执行
go get git.internal.company.com/foo/bar@v1.2.0 - 如果只是想 fetch 代码不改
go.mod,用go mod download git.internal.company.com/foo/bar
最容易被忽略的一点:私有模块的版本标签必须符合语义化格式(v1.2.0),不能是 dev 或 main,否则 go get 会找不到可用版本。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











