无外网时初始化fiber项目需先在外网机器执行go mod init和go get指定版本,再go mod vendor生成vendor目录,连同go.mod、go.sum一并拷入内网,内网执行go111module=on go build -mod=vendor。

局域网内无法直接 go get 是常态,不是网络配置问题,而是 Go 模块代理机制默认依赖公网;必须用离线方式预下载依赖并配置 GOPROXY=direct + GOSUMDB=off,否则 go build 会卡在 checksum 验证或 module lookup 阶段。
怎么在无外网机器上初始化 Fiber 项目
核心是「先在外网机器打包依赖,再复制进局域网」。不能指望 go mod download 在内网运行成功。
- 在外网 Linux/macOS 机器执行:
go mod init myapp && go get github.com/gofiber/fiber/v2@v2.52.0(显式指定已知稳定版本,避免 v2.53.0 这类未缓存的 tag) - 运行
go mod vendor,生成vendor/目录(含所有 transitive 依赖) - 把整个项目目录(含
go.mod、go.sum、vendor/)打包,拷贝进局域网机器 - 在局域网机器解压后,执行
GO111MODULE=on go build -mod=vendor -o server .
关键点:-mod=vendor 强制只读 vendor/,跳过远程 fetch 和 sum 校验;GO111MODULE=on 确保模块模式启用(即使没 go.mod 也会报错提示,比默认 auto 模式更可控)。
为什么不能只复制 vendor/ 而不带 go.mod
go build 在无 go.mod 时会退化为 GOPATH 模式,此时 vendor/ 被忽略,仍会尝试联网找模块。必须保留 go.mod 文件,哪怕它只有一行 module myapp。
- 若局域网机器连不上任何 GOPROXY(包括私有 Nexus),必须同时设
GOSUMDB=off,否则go build会在校验go.sum时失败 -
go.sum不可删:它记录了 vendor 内每个依赖的哈希值,-mod=vendor仍会校验它 - 别用
go mod tidy -e清理缺失模块——这会触发远程请求,直接报错退出
离线代理搭建(仅当需多项目共享依赖时)
如果局域网有几十个 Go 项目,手动 vendor 太重,可搭一个只读的私有 proxy,但注意:它不是「加速镜像」,而是「离线缓存服务」。
- 用
goproxy.io的开源版goproxy(非官方,Go 实现,轻量):在外网机器运行goproxy -modules="github.com/gofiber/fiber/v2,github.com/valyala/fasthttp" -cachedir=./cache - 用
wget -r -np -nH --cut-dirs=3 -R "index.html*" http://localhost:8080/github.com/gofiber/fiber/v2/@v/抓取所需版本的.info、.mod、.zip文件 - 把整个
./cache拷进局域网,启动goproxy -cachedir=./cache -listen=:8081 - 在局域网机器设
export GOPROXY=http://192.168.1.100:8081,direct(IP 替换为实际地址)
重点:这个 proxy 不提供实时同步,只做静态文件服务;go get 能工作,但只限于你提前抓过的模块和版本。没抓过的会 fallback 到 direct 并失败——这正是你想要的行为,避免意外联网。
常见翻车点:go build 报错 “checksum mismatch”
这几乎全是 go.sum 和 vendor/ 不匹配导致的,尤其发生在从别人机器拷贝来代码又自己改过 go.mod 的情况。
- 不要手动编辑
go.sum—— 它必须由go mod工具生成 - 如果改过
go.mod(比如升级 Fiber 版本),必须在外网重新go mod vendor,再全量拷进内网 - 检查
vendor/github.com/gofiber/fiber/v2/go.mod是否存在且内容完整;缺失会导致go build忽略该目录,转而尝试联网
真正容易被忽略的是 go.sum 的校验时机:它在 go build 解析 import 语句时就触发,早于 vendor 加载。所以哪怕 vendor 里文件齐全,sum 不对也直接失败。











