go list -m all 是唯一可靠提取完整依赖列表的方式,它输出当前模块图中所有被解析的模块(含indirect),格式稳定可管道处理,支持-json结构化输出,但不包含replace本地路径项和vendor内模块。

直接提取本地缓存里的模块依赖是可行的,但不能靠“复制文件夹”这种粗暴方式——Go 的模块缓存结构带校验和、伪版本、符号链接,手动搬运极易损坏。
go list -m all 是唯一可靠的方式提取完整依赖列表
它输出的是当前模块图中所有被解析到的模块(含 indirect),格式稳定、可管道处理,且不依赖网络或 GOPROXY 设置。
- 运行
go list -m all得到形如github.com/gorilla/mux v1.8.0的每行一条记录 - 加
-json参数可结构化输出:go list -m -json all,含Version、Replace、Indirect字段,适合脚本解析 - 注意:它不会列出
replace ./local这类本地路径替换项(因为不涉及下载),也不会包含 vendor 内模块 - 若项目用了
exclude,被 exclude 的模块仍可能出现在输出里——go list -m all只反映解析结果,不等价于“实际构建用到的集合”
从 $GOPATH/pkg/mod/cache/download 提取原始 zip 包要小心校验文件
这里存着所有已下载模块的压缩包(.zip)、校验信息(.ziphash)和元数据(.info),但它们不是按模块名平铺存放的。
- 路径形如:
$GOPATH/pkg/mod/cache/download/github.com/user/repo/@v/v1.2.3.zip - 必须同时保留对应的
.info和.ziphash文件,否则go build会因校验失败重下 - 不要只拷贝
.zip——Go 在构建时会读.info里的Origin字段来确认来源,缺失则报错invalid version: unknown revision - 想批量提取?可用
go list -m -f '{{.Path}} {{.Version}}' all生成路径模板,再拼出 cache 下的真实路径
go mod download all 不等于“提取”,而是“强制预加载”
这个命令本身不输出任何列表,它的作用是确保 go list -m all 中每一项都落到本地缓存里,为离线构建做准备。
- 执行前先跑
go mod tidy,否则go mod download all可能拉下已被删掉的旧 require 条目 - 它会跳过
replace到本地路径的模块(认为无需下载),也会忽略 vendor 目录里的内容 - 如果某模块 checksum mismatch,整个命令会中断退出,不会部分成功
- 加
-x参数能看到真实 fetch 地址:go mod download all -x,方便验证是否走对了代理(比如私有域名是否被direct正确绕过)
真正容易被忽略的是:缓存目录里看似“存在”的模块,未必能被构建系统识别——符号链接是否完好、.info 文件时间戳是否早于远程更新、GOSUMDB 是否在清理后仍尝试联网校验,这些细节比“有没有文件”更关键。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











