必须用go env -w GOPRIVATE=...全局设置才能让Go工具链识别私有模块路径,GoLand界面配置仅作用于IDE内部进程,不改变go env输出;还需同步设GONOSUMDB、GOPROXY含direct、确保Git认证可用。

GoLand里配GOPRIVATE,go env看不到是正常的
因为GoLand的Settings → Go → Environment variables里填的变量,只注入到IDE内部的go run、go test和调试器进程里,不写入Go的全局配置。你执行go env GOPRIVATE看到的是系统级或go env -w写入的值,不是IDE界面里输的那条。
所以别靠go env验证GoLand里配的对不对——它本来就不该显示出来。真正要测的是:你的项目能不能go mod tidy成功拉下私有模块,以及os.Getenv("GOPRIVATE")在程序里能不能读到(这需要额外在Run Configuration里再设一遍)。
必须用go env -w GOPRIVATE=...全局生效
内网拉私有模块的核心动作,是让Go工具链本身识别哪些路径不该走代理、不该校验sum。这个判断发生在go mod download、go build等命令底层,和IDE无关。所以必须用命令行持久化设置:
go env -w GOPRIVATE=git.internal.company.com/*,my.private.module- 多个域名用英文逗号分隔,
*表示通配子路径 - 如果私有仓库用SSH协议(如
git@git.internal.company.com:org/repo.git),确保本地~/.ssh/config或Git凭证已配好,否则go get会卡在认证环节 - 顺带加上
go env -w GONOSUMDB=git.internal.company.com/*,my.private.module,避免sum校验失败
GoLand的Run Configuration里还得再填一次
如果你的代码里写了os.Getenv("GOPRIVATE")做逻辑分支,或者某些第三方库依赖这个环境变量运行,那仅靠go env -w还不够——GoLand启动你的main函数时,默认不把全局环境变量传给进程。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
操作路径:右上角运行配置下拉箭头 → Edit Configurations… → 选中你的Go Build配置 → Environment variables → 点… → 添加键值对:
- 键:
GOPRIVATE,值:git.internal.company.com/*,my.private.module - 勾选
Include system environment variables(可选,但建议勾上,避免覆盖掉其他必要变量) - 保存后重新运行,
os.Getenv("GOPRIVATE")才能返回预期字符串
常见失败点:GOSUMDB没关、代理没绕过、权限没通
即使GOPRIVATE设对了,下面三个地方错一个,私有模块照样拉不下来:
-
GOSUMDB没同步关闭:Go默认用sum.golang.org校验所有模块,内网访问不了。执行go env -w GOSUMDB=off或go env -w GOSUMDB=sum.golang.google.cn -
GOPROXY没加direct后缀:比如设成GOPROXY=https://goproxy.cn,私有路径仍可能被代理转发失败。正确写法是GOPROXY=https://goproxy.cn,direct - Git SSH密钥未加载:Windows用户尤其容易忽略——IDE终端里
ssh -T git@git.internal.company.com能通,不代表Go工具链能用。确认ssh-agent已启动且密钥已ssh-add
最麻烦的是混合场景:一部分私有模块走HTTPS+Token,另一部分走SSH。这时候GOPRIVATE得覆盖全路径,~/.netrc和~/.ssh/config也得各自配妥,少一个环节就会静默失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










