go111module=on是启用go modules的强制开关,必须先设置并验证生效;goprivate需精确匹配模块路径前缀(如gitlab.example.com/*),多域名用逗号分隔且不可有空格;私有库认证依赖git层(.netrc或ssh),go不直接处理凭证;goproxy=direct或gonoproxy必须配合goprivate使用,否则代理仍会拦截私有请求。

GO111MODULE=on 必须先设,否则所有配置都白搭
不启用模块模式,go mod 命令压根不生效,GOPRIVATE、GONOSUMDB 全部被忽略,go get 仍走 GOPATH 老路径。这不是可选项,是启动开关。
- 运行
go env -w GO111MODULE=on永久生效(推荐) - 检查是否真生效:
go env GO111MODULE输出必须是on,不是auto或空 - 如果输出
auto,说明当前目录在$GOPATH/src下——直接移出该路径再试,别指望 auto 切换
GOPRIVATE 必须精确匹配模块路径前缀,不是域名白名单
GOPRIVATE 是路径前缀通配器,不是模糊域名过滤器。写错一个字符、漏掉 /*、多一个空格,私有模块就会被代理拦截或校验失败。
- 模块路径是
gitlab.example.com/group/repo,GOPRIVATE必须设为gitlab.example.com/*,不能只写gitlab.example.com - 多个域名用英文逗号分隔,**不能有空格**:
go env -w GOPRIVATE="gitlab.example.com/*,gitea.internal.org/*" - 含端口必须显式写出:
gitlab.example.com:8080≠gitlab.example.com,GOPRIVATE也得写全 - 子域名不自动继承:
GOPRIVATE=example.com不覆盖git.example.com,要分开写
认证凭据由 git 层提供,Go 自己不读 .netrc 或环境变量
Go 工具链调用的是系统 git 命令,凭证必须由 git 自己能识别的方式提供。.netrc 只在 HTTPS 场景下生效,且路径、权限、格式三者缺一不可。
-
.netrc路径:Linux/macOS 是$HOME/.netrc,Windows 是%USERPROFILE%/_netrc - 权限必须为
600:chmod 600 ~/.netrc,否则git直接忽略 - 内容不能有注释、空行;
machine值必须和go.mod中模块路径的域名**完全一致**(如模块是gitlab.example.com/group/lib,就写machine gitlab.example.com) -
password字段填 Personal Access Token(GitLab 勾选read_repository),不是登录密码 - SSH 方式则依赖
ssh-agent和~/.ssh/config,确保ssh -T git@gitlab.example.com能通
GOPROXY=direct 或 GONOPROXY 必须配合 GOPRIVATE 使用
只设 GOPRIVATE 不够。如果公司已全局配置 GOPROXY=https://proxy.company.com,Go 仍会先尝试走代理——而代理无法携带 .netrc 凭据或 SSH 密钥,必然 401 或超时。
- 最简方案:
go env -w GOPROXY=direct,彻底关闭代理,让 Go 直连 Git 服务器 - 若需保留部分代理,用
GONOPROXY排除私有域名:go env -w GONOPROXY="gitlab.example.com/*,gitea.internal.org/*" - HTTPS 私有仓库若用自签名证书,还需加
GOINSECURE=gitlab.example.com(仅限开发环境) - 不要混用
GOPROXY=direct和GONOPROXY,二者逻辑冲突,优先级难控
git 是否真能凭当前上下文拉下代码——先跑一遍 git clone https://gitlab.example.com/group/repo.git 或 git clone git@gitlab.example.com:group/repo.git,成功了,Go 才可能成功。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











