离线安装Go必须在联网机完成三件事:校验二进制包SHA256、预拉取全部依赖至$GOPATH/pkg/mod/cache/download/、固化GOPROXY=direct与GOSUMDB=off;否则离线机go build必卡在模块解析或校验阶段。

离线安装 Go 不是“解压完就完事”,必须在联网机上提前完成二进制包校验、依赖预拉取、环境变量固化三件事;否则内网机器上 go build 会卡在模块解析或校验阶段,报 no such host 或 checksum mismatch。
怎么下载并验证 Go 离线安装包
不能直接 curl https://go.dev/dl/,必须人工下载 + 本地校验。官网下载页(https://go.dev/dl/)下方明确列出每个包的 SHA256 哈希值,这是唯一可信依据。
- Linux x86_64:下载
go1.24.4.linux-amd64.tar.gz;ARM64 机器务必选go1.24.4.linux-arm64.tar.gz,错配会导致go list -m allpanic - Windows:下载
go1.24.4.windows-amd64.zip(非 MSI),MSI 安装器会尝试联网激活或写注册表,不适用于离线分发 - 校验命令(Linux/macOS):
sha256sum go1.24.4.linux-amd64.tar.gz,输出必须与官网页面完全一致 - 解压路径要固定:Linux 推荐
/usr/local/go,Windows 推荐C:\Go;避免解压到用户目录再软链,systemd、CI 脚本和 VS Code 终端都可能读不到
为什么 go version 成功但 go mod download 失败
因为默认 GO111MODULE=on,且未关闭代理和校验机制,Go 仍会硬连 proxy.golang.org 和 sum.golang.org —— 这两个域名在内网必然解析失败。
- 必须在离线机上执行:
go env -w GOPROXY=direct(不是off,off会跳过缓存查找逻辑) - 必须执行:
go env -w GOSUMDB=off(设为空字符串""仍会 fallback 到默认值) - 如果项目含
replace指向私有 Git 地址(如replace example.com/foo => ./local/foo),还需加-mod=readonly防止构建时自动修正路径 - 验证是否生效:
go env GOPROXY GOSUMDB输出应为direct和off,不是空或默认地址
如何让依赖在离线机上真正可用
只靠 go mod vendor 不够,vendor 目录不包含间接依赖的校验信息,也不处理 replace 的本地路径模块;Go 构建时仍会去 $GOPATH/pkg/mod 查找,导致失败。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 推荐方案:在外网机执行
go mod download,然后整份复制$GOPATH/pkg/mod目录到离线机同路径下(注意GOPATH必须一致) - 若必须用 vendor:执行顺序必须是
go mod tidy→go mod vendor→git add vendor/;漏掉tidy,vendor/modules.txt会缺失// indirect条目 -
replace指向本地路径的模块,必须手动拷贝进vendor/对应位置,并同步更新go.mod中的replace行为指向./vendor/xxx - 含 cgo 的包(如
net、os/user)即使 vendor 了,离线机也需预装gcc和libc6-dev(Linux)或 MinGW(Windows),否则报cannot find -lc
gopls 和 dlv 怎么离线部署
gopls 和 dlv 无法在内网用 go install,因为它们依赖大量第三方模块,执行时会卡在 Fetching … 或报 cannot find package。
- 在外网机执行:
go install golang.org/x/tools/gopls@latest和go install github.com/go-delve/delve/cmd/dlv@latest - 找到生成的可执行文件:
$GOPATH/bin/gopls和$GOPATH/bin/dlv(Linux/macOS)或%USERPROFILE%\go\bin\gopls.exe(Windows) - 复制到内网机的
/usr/local/go/bin/(Linux)或C:\Go\bin\(Windows),并确保执行权限(Linux 上用chmod +x) - VS Code 中禁用自动安装,在设置里显式指定:
"go.goplsPath": "/usr/local/go/bin/gopls"和"go.dlvPath": "/usr/local/go/bin/dlv"
最易被忽略的是环境变量加载时机:写入 /etc/profile.d/golang.sh 后,必须新开终端或运行 source /etc/profile.d/golang.sh,否则 CI 脚本、systemd 服务、VS Code 内置终端都读不到 GOROOT;而 go version 成功但 go env GOROOT 为空,基本就是这个原因。

















