离线安装go必须解压到/usr/local/go等系统级路径,禁用goproxy和gosumdb,执行go mod tidy后再go mod vendor -v,并用go build -mod=vendor构建;vscode需手动拷贝gopls和dlv二进制。

离线安装 go 二进制包必须解压到系统级路径
内网服务器上直接解压 go1.22.3.linux-amd64.tar.gz 到 /opt/go 或 /usr/local/go,不能放在用户家目录(如 ~/go)再软链——很多 CI 工具、systemd service、容器构建环境读不到非标准路径,且权限继承混乱会导致 go install 写入失败。
验证是否解压到位:运行 ls /usr/local/go/bin/go 应存在;若报错 “No such file”,说明解压路径或层级错了(常见错误是把 tar 包里嵌套的 go/ 目录漏掉,应带 -C 参数解压)。
- 正确命令:
sudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz - 检查
GOROOT是否自动识别:go env GOROOT输出应为/usr/local/go;若为空或错误,手动设:go env -w GOROOT=/usr/local/go -
PATH必须包含$GOROOT/bin,写入/etc/profile.d/golang.sh并source,避免仅在当前 shell 临时 export
GOPROXY=direct + GOSUMDB=off 是内网构建不卡住的前提
内网机器默认会尝试连接 proxy.golang.org 和 sum.golang.org,超时后阻塞数分钟才失败。这不是网络配置问题,而是 Go 模块机制的硬依赖——必须显式关闭。
执行这两条命令即可生效:go env -w GOPROXY=direct 和 go env -w GOSUMDB=off。注意顺序无关,但缺一不可:只关 GOPROXY 不关 GOSUMDB,go build 仍会在校验阶段连外网。
- 验证:
go env GOPROXY GOSUMDB输出应为direct off - 若项目用
replace指向内网 Git 地址(如git.internal.company/mylib),确保该地址在内网 DNS 可解析,否则go mod download仍会失败 - CI 流程中建议在脚本开头固定设置:
export GOPROXY=direct GOSUMDB=off,避免依赖用户级go env配置
go mod vendor 必须配合 go mod tidy 才真正离线
go mod vendor 不是“一键打包”,它只复制 go list -m all 解析出的模块,跳过测试依赖、未被引用的 // indirect 条目,以及 replace 指向的本地路径——这些遗漏项会在构建时触发联网请求。
正确流程只有三步:先 go mod tidy 清理并补全依赖树,再 go mod vendor -v(加 -v 才能看到实际拷贝了哪些包),最后检查 vendor/modules.txt 行数是否与 go.sum 的 module 条目数一致。
- 常见坑:
go mod vendor后仍报cannot find module,大概率是go.mod里有replace但没执行go mod edit -replace改成本地相对路径 - 若项目含 cgo 依赖(如
github.com/mattn/go-sqlite3),vendor不解决底层 C 库缺失问题,需提前在目标机器装好gcc、pkg-config和对应头文件 - 构建命令必须加
-mod=vendor:go build -mod=vendor,否则 Go 还会尝试从$GOPATH/pkg/mod查找
VSCode 调试需手动补全 gopls 和 dlv
内网 VSCode 安装 Go 插件后,gopls 和 dlv 不会自动下载——插件只是前端,核心二进制仍需联网获取。必须从外网机器提取并拷贝。
在外网机器用相同 Go 版本执行:go install golang.org/x/tools/gopls@latest 和 go install github.com/go-delve/delve/cmd/dlv@latest,然后把生成的 gopls、dlv 二进制文件(位于 $GOPATH/bin/)复制到内网机的 $GOROOT/bin/ 或 $GOPATH/bin/ 下。
- 验证:
gopls version和dlv version能正常输出即成功 - VSCode 设置里确认
"go.goplsPath"和"go.dlvPath"指向正确路径,否则编辑器提示 “gopls not found” - 不要依赖插件自动下载功能,它默认走
GOPROXY,而内网已设为direct,必然失败
go mod vendor 后没加 -mod=vendor 参数就直接 go build,或者以为 GOPROXY=direct 就万事大吉,却忘了 GOSUMDB 仍在后台偷偷连外网。真离线不是“不报错”,而是全程无 DNS 查询、无 TCP 连接尝试。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











