go mod download 默认下载到 gomodcache(即 $gopath/pkg/mod 或 $home/go/pkg/mod),不支持命令行指定目录;如需自定义路径,须通过临时或永久设置 gomodcache 环境变量实现。

go mod download 默认不支持指定目录,必须改用 GOPATH 或 GOMODCACHE
Go 的 go mod download 命令本身没有 --output 或 -o 参数,它只会把依赖模块下载到 GOMODCACHE(通常是 $GOPATH/pkg/mod),且无法通过命令行直接改变路径。想“保存到指定本地目录”,本质是绕过默认缓存机制,用其他方式达成效果。
方案一:临时修改 GOMODCACHE 环境变量(最轻量、推荐)
这是最常用也最稳妥的做法——不改项目结构、不污染全局配置,只在当前命令中生效:
- 运行前临时设置:
GOMODCACHE=/your/custom/path go mod download - 路径必须是绝对路径,且需有写入权限;若目录不存在,Go 会自动创建
- 该设置仅对本次命令有效,不影响后续其他 Go 命令
- 下载后的目录结构和官方缓存一致(
cache/xxx@v1.2.3.zip+cache/xxx@v1.2.3/解压内容),可直接被go build -mod=readonly引用(需配合-modcacherw或提前chmod)
方案二:用 go mod vendor + 替换 vendor 目录位置(适合离线构建场景)
go mod vendor 会把所有依赖复制进项目下的 vendor/ 目录,但它不接受自定义路径。若你真需要“保存到指定目录而非 vendor/”,只能事后移动:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 先执行
go mod vendor(生成标准vendor/) - 再用
mv vendor /your/custom/vendor移动过去 - 构建时显式启用 vendor 模式:
go build -mod=vendor -modfile=/dev/null - 注意:
go mod vendor不下载 replace 后的源码(如replace example.com => ./local),那些仍需手动处理
常见错误与陷阱
很多人卡在这几个点上:
- 误以为
go get -d能指定目录 —— 它只是下载并解压到GOMODCACHE,行为和go mod download几乎一样 - 试图用
GOBIN控制模块下载路径 ——GOBIN只影响go install编译出的二进制位置,和模块无关 - 在 CI 中设了
GOMODCACHE却没清理旧缓存 —— 多次运行可能混入不同版本,建议搭配go clean -modcache使用(但会清空整个缓存) - 用
go mod download后直接打包GOMODCACHE目录 —— 注意其中包含大量.info、.zip和解压后文件,实际只需.zip和对应解压目录即可复现构建环境
真正要“保存依赖供离线使用”,别只盯着下载动作;得明确下游怎么用——是给另一台机器的 go build 用?还是塞进容器镜像?路径可控性、校验完整性、是否含私有模块,这些才是决定方案的关键。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










