必须先启用go111module=on,否则goproxy、goprivate等配置均无效;go111module需设为on而非auto,且goprivate域名匹配须精确(如gitlab.example.com/*),同时需配合git url重写与.netrc凭据配置才能使私有模块正常拉取。

GO111MODULE=on 必须先启用,否则所有配置都无效
Go 模块功能不是“默认就可用”,即使你用的是 Go 1.13+,老项目或手动安装的旧版 Go 很可能仍处于 GOPATH 模式。go mod 命令在 GO111MODULE=auto 或空值下会静默失效,go get 仍走 GOPATH 路径,GOPRIVATE 完全不生效。
实操建议:
- 运行
go env -w GO111MODULE=on永久启用(推荐) - 检查是否生效:
go env GO111MODULE输出必须是on,不是auto或空 - 若输出
auto,说明当前目录在$GOPATH/src下——直接移出该路径再试,别依赖 auto 切换
GOPRIVATE 域名匹配必须精确,通配符不能乱写
GOPRIVATE 不是域名白名单,而是模块路径前缀通配器。写错一个字符、多一个空格、漏掉 /*,私有模块就会被代理拦截或校验失败。
常见错误现象:
-
go mod download卡在git ls-remote,或报unknown revision - 明明设了
GOPRIVATE=gitlab.example.com,但模块路径是gitlab.example.com/group/repo,仍走公网代理 - Windows 下用
set GOPRIVATE=没生效——PowerShell 需用$env:GOPRIVATE="",CMD 才用set
正确写法示例:
go env -w GOPRIVATE="gitlab.example.com/*,github.com/my-team/*"
* 必须紧贴斜杠后,不能写成 gitlab.example.com\* 或 gitlab.example.com/ *(空格破坏匹配)。
认证凭据必须由 git 层提供,Go 不自己读 .netrc
Go 工具链本身不解析 .netrc,它调用系统 git 命令拉取代码,而 git 在 HTTPS 场景下才查 .netrc。所以路径、权限、格式三者缺一不可。
实操要点:
-
.netrc路径只能是$HOME/.netrc(Linux/macOS)或%USERPROFILE%/_netrc(Windows) - 权限必须为
600:chmod 600 ~/.netrc,否则git直接忽略 - 内容不能有注释、空行,
machine值必须和go.mod中模块路径的域名完全一致(如模块是gitlab.example.com/group/lib,就写machine gitlab.example.com) -
password字段填 GitLab 的 Personal Access Token(勾选read_repository),不是登录密码
GOPROXY=direct 与 git URL 重写必须配合 GOPRIVATE 使用
只设 GOPRIVATE 不够。如果公司 Nexus 或自建代理已配置 GOPROXY,Go 仍会先尝试走代理——而代理无法携带 .netrc 凭据或 SSH 密钥,必然 401 或超时。
解决方案分两种场景:
- 用 HTTPS 私仓:执行
git config --global url."https://token:x-oauth-basic@git.example.com/".insteadOf "https://git.example.com/" - 用 SSH 私仓:执行
git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/",并确保ssh -T git@gitlab.example.com能通 - 同时启用代理和跳过校验:
export GOPROXY="https://goproxy.your-company.com,direct",其中direct是保留字,表示对GOPRIVATE中的域名绕过所有代理直连
最容易被忽略的一点:如果你的私有仓库地址带端口(如 git.example.com:2222),GOPRIVATE 必须写成 git.example.com:2222,端口不能省略;否则匹配失败,Go 仍会把请求发给代理。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











