离线安装Go二进制包必须人工下载、SHA256校验、解压至统一路径(如/usr/local/go),并显式配置GOPROXY/GOSUMDB/GOPRIVATE及-mod=readonly,否则易因路径错误、校验缺失或隐式联网导致失败。

离线安装 Go 二进制包必须校验 SHA256 并解压到统一系统路径
内网机器不能 curl 下载,必须人工下载、校验、分发。只拷贝 go1.xx.x.linux-amd64.tar.gz 不够,漏掉校验和路径错误是两大高频失败点。
- 从
https://go.dev/dl/手动下载对应架构的 archive 包(如go1.22.5.linux-amd64.tar.gz),**勿选 .msi/.pkg/.deb** - 在可联网的可信机器上运行:
sha256sum go1.22.5.linux-amd64.tar.gz,比对官网页面下方公布的哈希值 - 解压目标路径固定为
/usr/local/go(Linux)或C:\Go(Windows),**不要解压到$HOME或用软链替代**,否则go install写入路径错乱 - 验证:
go version能输出版本,且go env GOROOT返回/usr/local/go(非空或默认推导路径)
GOPROXY 和 GOSUMDB 必须显式设为内网可控值,不能留空或依赖默认
内网 go mod download 卡住、报 failed to fetch 或 verifying ...: Get "https://sum.golang.org/",90% 是这两个变量没配对。
-
GOPROXY推荐方案:部署athens到内网,设为http://athens.internal:3000;无条件则临时用direct,但需确保所有依赖已预置(如go mod vendor或提前go mod download好) -
GOSUMDB不能只设off——放弃校验风险高;更稳妥的是设sum.golang.org+https://sum.golang.org并配合内网 DNS 将sum.golang.org解析到私有校验服务,或直接用GOSUMDB=off+go mod verify定期人工校验 - 务必写入系统级配置:
/etc/profile.d/golang.sh(Linux)或系统环境变量(Windows),避免仅当前 shell 有效 - 验证:
go env GOPROXY GOSUMDB输出应为设定值,不是空或https://proxy.golang.org
私有 Git 仓库依赖必须用 GOPRIVATE 显式声明,否则 go get 会跳过认证
访问 gitlab.example.cn/team/lib 报 module gitlab.example.cn/team/lib: reading gitlab.example.cn/team/lib/go.mod at revision v1.2.0: unexpected status code 401,说明 Go 工具链没把该域名当私有源处理。
-
GOPRIVATE必须包含完整域名或通配符,例如:gitlab.example.cn,*.corp.internal(逗号分隔,不带协议) - 设置方式:
go env -w GOPRIVATE=gitlab.example.cn,或写入 shell 配置文件:export GOPRIVATE=gitlab.example.cn - 若仓库需 SSH 认证,确保
~/.ssh/id_rsa存在且ssh-agent已加载;若用 HTTPS + Token,需配置 Git 凭据助手:git config --global credential.helper store - 验证:
go env GOPRIVATE输出应含目标域名;执行go get gitlab.example.cn/team/lib@v1.2.0不再报 401
离线构建时必须禁用网络 fallback,用 -mod=readonly 防止静默联网
CI 构建机看似有 vendor/ 目录,却仍卡在 fetching github.com/sirupsen/logrus,是因为 Go 默认允许在 vendor 缺失时自动回退联网拉取。
立即学习“go语言免费学习笔记(深入)”;
- 构建命令必须加
-mod=readonly参数:go build -mod=readonly -o app ./cmd/app - CI 环境要额外设:
GOPROXY=direct GOSUMDB=off,避免任何模块查找阶段尝试连接外网 -
go mod vendor前先go mod tidy -v,确保go.mod干净;加-v可暴露 replace 路径不可达等静默问题 - 注意:
go mod vendor不包含测试依赖或本地 replace 路径,若项目依赖replace example.com/foo => ../foo,需手动拷贝../foo到 vendor 目录下


















