离线状态下GoLand可用,但必须提前在联网机完成三件事:完整拷贝Go SDK、生成齐全的go.mod与go.sum、将依赖落盘至vendor/或模块缓存;缺一则IDE卡在“Loading modules”或报cannot find module等错误。

离线状态下 Golang 开发环境能用,但必须提前在联网机器上完成三件事:Go SDK 完整拷贝、go.mod 和 go.sum 齐全、依赖已落盘到本地缓存或 vendor/ 目录。缺一不可,否则 GoLand 启动后卡在 “Loading modules”,或 go build 报 cannot find module、proxy.golang.org: no such host。
GoLand 启动就卡在 “Loading modules” 怎么办
这不是网络超时,是 GoLand 在等 go mod download 返回——而离线环境下它永远等不到。根本原因是没提前准备好模块缓存或 vendor 目录,IDE 默认行为就是触发模块加载。
- 确认
GOROOT已在 GoLand 中手动指定:Settings → Go → GOROOT → 点+→ 选整个go文件夹(如/opt/go),不能只选bin/go或go.exe - 检查离线机是否设置了
GOPROXY=direct和GOSUMDB=off;只设GO111MODULE=on不够,这两个才是绕过网络校验的硬开关 - 若项目已存在
vendor/,在 GoLand 中需额外配置构建参数:-mod=vendor(Settings → Go → Build Tags & Vendoring → Vendor directory) - 验证方式:在 GoLand 内置终端运行
go list -m all,应秒出结果且无任何域名解析日志;若卡住或报错,说明环境变量未生效或缓存缺失
go mod download 在离线机上为什么一定失败
go mod download 是纯网络命令,不读本地 vendor/,也不查 $GOPATH/pkg/mod/cache 是否已有内容——它默认强制走代理或直接 fetch 远程索引。离线机上执行只会卡 DNS 或报 no such host。
- 正确做法是在联网机、用**完全相同版本**的 Go(如离线机是
go1.21.6,联网机也必须是go1.21.6,不能是go1.21.x)执行:go mod download -x - 观察输出中所有模块是否都写入
$GOPATH/pkg/mod/cache/download/,路径形如github.com/gorilla/mux/@v/v1.8.0.info,不是扁平源码包 - 打包时用
tar -czf mod-cache.tar.gz -C $GOPATH/pkg mod/cache/,解压到离线机时路径必须与原$GOPATH一致(如/home/user/go) - 私有模块(
replace到内网 Git 地址)不会被go mod download拉取,需单独git clone并同步 commit ID,再用go mod edit -replace改为相对路径
vendor/ 目录生成了但 go build 还是报错
常见于 Go 1.11+ 环境:vendor 不是默认启用的,go build 仍优先走 go.mod + $GOPATH/pkg/mod,完全无视 vendor/,除非显式干预。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
- 运行
go build -v观察输出:若看到vendor/被打印(如compile [vendor]/github.com/sirupsen/logrus/...),说明生效;若看到$GOROOT/src/或$GOPATH/pkg/mod/,则 vendor 被跳过 - Go ≥1.14 必须加
-mod=vendor参数才能强制走 vendor;GoLand 中需在 Settings → Go → Build Tags & Vendoring → 勾选 “Use vendor directory” -
go mod vendor前必须先go mod tidy,否则// indirect依赖可能漏掉,导致vendor/modules.txt与go.sum不一致 - 别手动
cp -r vendor拷贝,隐藏文件(如.git或时间戳)丢失会导致校验失败;应整体打包vendor/目录并保留结构
CGO_ENABLED=0 交叉编译时 DNS 解析失效
离线环境常需跨平台编译(如 Linux 编译 Windows 二进制),关掉 cgo 后 net 包会退回到纯 Go 实现,但依赖系统配置文件(如 /etc/resolv.conf)——而离线机很可能没有该文件,或路径不可读。
- 用
go list -f '{{.CgoFiles}}' ./查哪些包含 cgo;关键依赖如github.com/mattn/go-sqlite3建议提前静态编译好并replace进来 - 若必须启用 cgo(如调用 OpenSSL),离线机需预装对应头文件和静态库(如
libc6-dev、libpthread.a),否则go build报cannot find -lc - 国产 OS(麒麟、统信)上,
CGO_ENABLED=0可能导致os/user.Lookup失败,因纯 Go 实现依赖/etc/passwd格式;此时需确保目标系统该文件存在且可读 - 验证是否真离线:用
strace -e trace=connect,openat go build 2>&1 | grep -E "(proxy|sum|golang.org)",输出为空才代表没任何网络尝试
最易被忽略的是:不同 Go 版本对 go.sum 哈希算法和模块路径解析规则不兼容。哪怕只差一个小版本(如 go1.22.5 vs go1.22.6),缓存或 vendor/ 拷过去也会报 checksum mismatch。版本一致性不是建议,是硬性前提。

















