离线部署go项目必须显式禁用联网路径:执行go env -w goproxy=direct和go env -w gosumdb=off,否则go mod download会卡在连接proxy.golang.org和sum.golang.org;vendor目录需配合-go build -mod=vendor使用,且预下载依赖须完整打包gomodcache目录并确保go版本一致。

离线部署 Go 项目,go mod download 卡住或报 connection refused 不是网络配置问题,而是 Go 默认依赖公网代理和校验服务,内网根本连不上——必须提前切断所有联网路径,否则构建必失败。
go mod download 在离线机上卡死,怎么快速止血
这不是模块没下载完,而是 Go 还在尝试连接 proxy.golang.org 和 sum.golang.org。临时救急只需两行:
-
go env -w GOPROXY=direct:跳过代理,直读本地缓存(不发起任何 HTTP 请求) -
go env -w GOSUMDB=off:彻底禁用校验和检查,避免因无法访问sum.golang.org挂起
验证是否生效:go env GOPROXY GOSUMDB 应输出 direct off。注意:GOPROXY=off 是无效写法,Go 会 fallback 到默认值;必须用 direct。
预下载依赖必须在有网机器上做对三件事
只拷贝 go.mod 和 go.sum 没用,Go 构建时仍要查缓存目录。真正要打包的是完整模块缓存:
- 用与目标环境**完全一致的 Go 版本**执行
go mod download(版本差一级都可能触发checksum mismatch) - 确认缓存路径:
go env GOMODCACHE,通常是$GOPATH/pkg/mod,但可能被GOPATH值影响 - 打包整个
GOMODCACHE目录(不是软链接),解压到离线机相同路径;若路径不一致,go build会直接报cannot find module
可加 -x 参数观察实际下载路径:go mod download -x golang.org/x/net,避免漏掉标准库间接依赖。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
vendor 目录为什么离线后还是编译失败
go mod vendor 看似“全量打包”,但它不解决两个硬伤:
- 不会包含
replace指向的私有模块源码,需手动git clone并用go mod edit -replace=xxx=./vendor/xxx改为本地路径 - Go 1.11+ 默认启用模块模式,
vendor/不会自动生效——必须显式加-mod=vendor参数:go build -mod=vendor - 运行
go build -v观察输出:若看到vendor/字样才表示真正在读,否则仍在查$GOPATH/pkg/mod
别信 go build 没报错就成功;用 strace -e trace=connect,openat go build 2>&1 | grep -E "(proxy|sum|http)" 可验证是否真离线。
交叉编译产物在目标机报 not a valid ELF executable 怎么排查
这几乎一定是 CGO_ENABLED 或架构错配导致的:
- 先确认目标机真实架构:
uname -m(x86_64≠amd64,aarch64≠arm64),Go 的GOARCH值必须严格匹配 - 默认开启 CGO 时,二进制会动态链接宿主机 libc,内网老旧系统常不兼容;最稳做法是:
CGO_ENABLED=0 go build -o app - 若项目必须用 cgo(如 SQLite、OpenSSL),则离线机必须预装对应头文件和静态库(如
libc6-dev、libpthread.a),且go list -f '{{.CgoFiles}}' ./要能列出文件
跨平台编译前务必清缓存:go clean -cache -modcache,否则 macOS 上残留的 darwin 编译产物可能污染 Linux 构建结果。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










