离线go环境搭建必须提前在联网机完整打包三类内容:go二进制包(需匹配目标架构与go.mod声明版本)、$gopath/pkg/mod完整目录(含元数据文件)、并配置goproxy=direct与gosumdb=off以禁用联网校验。

能离线导入,但必须提前在联网机器上完整打包三类东西:Go二进制、模块缓存、校验绕过配置。漏掉任意一类,go build 就会卡在 module github.com/xxx@latest not found 或 verifying xxx: checksum mismatch。
Go二进制包怎么选才不白拷贝
不是随便下个 go1.22.3.linux-amd64.tar.gz 就完事。关键看三件事:
- 目标服务器的
uname -m输出必须和压缩包名里的架构完全一致(arm64≠amd64,aarch64有时要对应arm64) - Go版本要和团队项目
go.mod里声明的go 1.21或go 1.22对齐,否则go mod download生成的缓存可能被拒绝加载 - 解压路径建议固定为
/usr/local/go(Linux/macOS)或C:\Go(Windows),避免后续GOROOT配置出错
模块缓存目录必须整棵复制,不能只挑文件
离线时 go get 失败,根本原因不是没代码,而是 Go 查不到模块元数据。它依赖 $GOPATH/pkg/mod 下的完整目录结构,比如:
github.com/sirupsen/logrus@v1.9.3/ ├── list ├── info ├── zip └── lock
只复制源码文件夹,不复制这些元数据文件,go list -m all 就看不到该模块。
- 在联网机器上,用项目根目录执行:
go mod download -x,确认所有依赖已落盘到$GOPATH/pkg/mod - 打包整个
$GOPATH/pkg/mod目录(不是cache/download,那是临时下载区) - 离线机上,确保
GOPATH已设(如/home/user/go),再把包解压到/home/user/go/pkg/mod,路径必须严丝合缝
构建时必须关掉两道默认联网检查
即使文件全在,go build 默认仍会尝试连 proxy.golang.org 和 sum.golang.org。必须显式禁用:
-
GOPROXY=direct:跳过代理,直接查本地缓存(不是off,off会触发旧版 GOPATH 模式) -
GOSUMDB=off:关闭校验和数据库查询,否则遇到go.sum里没记录的模块或哈希不匹配,直接报错退出 - 这两个变量得写进环境,不能只当前终端临时设:
go env -w GOPROXY=direct GOSUMDB=off
验证是否真离线:别信输出,要看网络连接
运行 go build 成功不代表离线——它可能只是缓存命中,没触发联网。真正验证方法是:
- 在离线机上先清空 DNS 缓存:
sudo systemd-resolve --flush-caches(systemd 系统)或sudo /etc/init.d/nscd restart - 开一个新终端,执行:
tcpdump -i any port 53 or port 443 -c 5 - 再跑
go build,如果tcpdump抓到任何包,说明仍有隐性联网行为(常见于私有模块未replace或go.mod里写了未预下载的require)
最容易被忽略的是:团队项目用了 replace 指向内部 Git 地址,但离线机没配 SSH key 或没同步对应仓库——这时 go build 会静默 fallback 到 proxy,而你根本看不到错误。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











