模块路径必须带域名(如git.internal/team/utils),否则go mod tidy报错;需配置goprivate跳过代理与校验;git认证由git命令处理,replace仅限开发且上线前必须删除。

模块路径必须带域名,哪怕只是假的
Go 工具链强制要求模块路径(module 声明)是类 URL 格式,不能是 mylib 或 ./utils,否则 go mod tidy 直接报错:malformed module path "mylib": missing dot in first path element。局域网没公网域名?没问题——用假域名就行。
实操建议:
- 初始化时用
go mod init git.internal/team/utils(git.internal是任意可解析的假域名,不需真实 DNS) - 所有
import语句、require行、replace目标都必须严格匹配这个路径 - 如果用 GitLab 内网地址是
http://192.168.10.5/group/lib,模块路径也应设为192.168.10.5/group/lib,而非改写成git.internal—— 否则go get无法映射到真实 Git 地址
GOPRIVATE 是必配项,不是可选项
不设 GOPRIVATE,Go 默认会把私有路径当成公共包,去 proxy.golang.org 查、去 sum.golang.org 校验,结果就是:module git.internal/team/utils: reading https://proxy.golang.org/...: 404 Not Found 或 verification failed。
正确做法:
- 执行
export GOPRIVATE=git.internal/*(Linux/macOS)或$env:GOPRIVATE="git.internal/*"(PowerShell) - 多个域名用逗号分隔,**不能有空格**:例如
export GOPRIVATE="192.168.10.5/*,git.internal/*" - 写入
~/.zshrc或~/.bashrc,避免每次新开终端重设 -
GOPRIVATE只影响拉取行为:跳过代理、跳过校验和检查,直接走git clone
Git 认证失败?问题不在 Go,在 git 配置
Go 本身不处理认证,它调用系统 git 命令拉代码。所以 go mod download 卡住或报 unknown revision,大概率是 git clone https://git.internal/team/utils 本身失败。
常见场景与对策:
- 用 HTTPS 但需要 token:配置
git credential,或在~/.gitconfig加:[url "https://token:x-oauth-basic@git.internal/"] insteadOf = https://git.internal/ - 用 SSH 但 Go 默认走 HTTPS:加全局重写:
git config --global url."git@git.internal:".insteadOf "https://git.internal/" - 内网自签名证书:不推荐关全局校验,而是用
git config --global http."https://git.internal/".sslVerify false - 验证是否生效:手动跑
git clone https://git.internal/team/utils,成功了,go mod才可能成功
上线前必须删掉 replace,CI 不认本地路径
replace 是开发阶段的临时方案,写在 go.mod 里:replace git.internal/team/utils => ./local-utils。但它只对当前模块生效,且依赖路径必须含 go.mod 文件、module 声明必须一致。
风险点很明确:
- CI 环境没有
./local-utils这个目录,go build直接失败 - 下游项目不会继承你的
replace,它们仍要自己解决拉取逻辑 - 打包进 Docker 镜像时若漏删,运行时 panic:找不到包
真正分发私有包,靠的是 GOPRIVATE + 正确的 Git 可访问性 + 语义化标签(v1.2.0)。replace 只该出现在你本地开发的 go.mod 里,提交前删掉,或者用 .gitignore 排除临时修改。
局域网部署最易被忽略的一点:模块路径和 Git 仓库 URL 的结构必须对齐,差一个斜杠、多一个 .git 后缀,go get 就找不到——这不是 Go 的 bug,是它按规则解析 URL 的必然结果。











