go模块依赖不跨系统共享,真正可迁移的是go.mod与go.sum文件;pkg/mod缓存因os绑定、校验和平台相关,不可直接拷贝,应在新系统执行go mod download按清单拉取。

go mod download 下载的依赖不跨系统共享
Go 模块依赖下载后存在 $GOPATH/pkg/mod 或 $HOME/go/pkg/mod(Linux/macOS)或 %USERPROFILE%\go\pkg\mod(Windows),这个路径是**操作系统绑定、架构相关、不可直接拷贝复用**的。你把 Linux 上下载好的 pkg/mod 整个文件夹复制到 Windows,go build 会报错或静默失败——不是因为代码问题,而是校验和不匹配、路径分隔符差异、甚至 go.sum 中记录的 checksum 是基于源平台生成的。
真正可迁移的是 go.mod + go.sum,不是 pkg/mod 缓存
迁移项目时,只需确保以下三样东西完整带到新系统:
-
go.mod和go.sum文件必须随项目一起提交 Git(它们是声明式清单,与 OS 无关) -
GO111MODULE=on(Go 1.16+ 默认开启,但建议显式确认) -
GOPROXY设置合理(如https://goproxy.cn,direct),尤其国内环境避免因代理失效导致重下失败
在新系统上执行 go mod download 或首次 go build,会自动按 go.sum 校验过的版本拉取——这才是安全、可重现的迁移方式。别试图“同步缓存目录”,它既没用,还可能污染本地校验状态。
Windows ↔ Linux 间容易踩的坑
常见翻车点集中在路径和大小写上:
- Windows 默认文件系统(NTFS)不区分大小写,Linux(ext4/xfs)严格区分——如果依赖里有
github.com/SomeOrg/pkg和github.com/someorg/pkg同时存在(极少见但可能),Linux 会报冲突,Windows 可能悄无声息覆盖 -
replace指向本地路径时,replace example.com/a => ../a在 Windows 上要用反斜杠或正斜杠统一(Go 内部会 normalize,但手动编辑时混用易出错) - 某些模块含 cgo 或构建 tag(如
// +build linux),在 Windows 上go mod download all仍会拉下来,但go build时才报错;建议用go list -m all看全量列表,再结合目标平台验证
离线迁移?用 go mod vendor + GOPROXY=direct
若新环境完全断网,又不想依赖公网代理,唯一可靠路径是:
- 在联网机器上运行
go mod vendor(生成vendor/目录,含所有依赖源码) - 确认
go env -w GO111MODULE=on且go env -w GOPROXY=direct(禁用代理) - 把整个项目(含
vendor/)复制过去,执行go build -mod=vendor
注意:go mod vendor 不处理 replace 到本地路径的模块,也不包含 //go:embed 引用的文件——这些得手动一并带过去。
go.mod 和 go.sum 的确定性,不是缓存目录的搬运。任何试图“复制 pkg/mod”的做法,都是在给后续构建埋雷。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











