离线go编译必须在联网机用同版本go预拉取依赖:先go mod tidy,再go mod download -x确认落盘;离线机须设goproxy=direct且gosumdb=off,并配合cgo_enabled=0确保全程不联网。

go mod download 预拉取依赖必须在联网机用同版本 Go 执行
离线机上 go mod download 必然失败,不是命令写错,而是它默认会连 proxy.golang.org 和 sum.golang.org。唯一可行路径是:在有网、且 Go 版本完全一致(如都是 go1.24.5)的机器上提前执行。
- 进项目根目录,先运行
go mod tidy确保go.mod干净 - 再执行
go mod download -x,加-x可看到每个模块实际落盘路径,确认无超时或跳过 - 关键检查点:
go list -m all输出的每一行,都得能在$GOMODCACHE/download/下找到对应.zip和.info文件 - 若项目含
replace指向私有 Git 仓库,必须同步git clone那个 repo,并用go mod edit -replace=xxx=./path/to/local改成本地相对路径
GOPROXY=direct 和 GOSUMDB=off 缺一不可
只设 GOPROXY=off 或留空,GOSUMDB 仍可能 fallback 到默认值;只关 GOSUMDB 而不设 GOPROXY=direct,Go 仍会尝试解析代理域名——两者必须同时显式设置。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 在离线机上执行:
go env -w GOPROXY=direct(注意不是off或空字符串) - 执行:
go env -w GOSUMDB=off(设为""仍可能触发 fallback,必须是off) - 验证是否生效:
go env GOPROXY GOSUMDB应输出direct off - 若项目用了
replace且目标是内网 Git 地址,还需加-mod=readonly参数防止go build自动修正模块路径
vendor 目录不是“复制过去就能用”
go mod vendor 生成的 vendor/ 看似完整,但构建时仍可能去 $GOMODCACHE 查间接依赖或校验和,尤其当 go.sum 里有未被 vendor 覆盖的条目时。
- 执行顺序必须是:
go mod tidy→go mod download→go mod vendor - 检查
vendor/modules.txt是否与go.sum条目严格对齐,缺失任意一行都会导致go build -mod=vendor拒绝使用 vendor -
vendor/不包含// indirect标记的包,除非它们被显式 import 进代码;测试依赖(_test.go中引用的包)也不会自动 vendor - 若用 CI 生成 vendor,别只 rsync 项目目录——必须同步整个
$GOCACHE或确保 CI 机器已完整拉取所有依赖
CGO_ENABLED=0 是离线编译安全底线
默认开启 CGO 会让 go build 尝试调用 gcc、链接系统 libc,而离线机往往没装 build-essential 或对应 devtoolset,直接报 exec: "gcc": executable file not found in $PATH。
- 所有构建命令前加前缀:
CGO_ENABLED=0 go build -o app - 注意副作用:禁用 CGO 后,
net包会回退纯 Go DNS 解析,无法读/etc/resolv.conf,可能导致服务发现失败 - 若项目必须用 cgo(如
github.com/mattn/go-sqlite3),离线机需提前装好gcc、libc6-dev、pkg-config,并用go list -f '{{.CgoFiles}}' ./检查哪些包含 cgo 文件 - 交叉编译到 ARM 或国产 OS(如麒麟)时,还得确认目标架构的静态库(如
libpthread.a)是否存在
go mod download 到 go build 全程无任何域名解析、TCP 连接尝试——这点容易被忽略,因为没报错不等于没联网。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










