go list -m all用于列出当前模块及其所有直接、间接依赖的模块版本,需在含go.mod的根目录执行,加-json可结构化输出,all是关键字不可替换。

查看当前模块的依赖树用 go list -m all
这个命令能列出当前模块及其所有直接、间接依赖的模块版本,是排查依赖冲突或升级影响的第一步。它读取 go.mod 文件并递归解析,结果按字母序排列,不反映实际加载顺序。
常见错误现象:go list -m all 在未初始化模块的目录下报错 no modules found;或在子目录中执行时误以为显示的是该子包的依赖,其实仍是根模块视角。
- 务必在模块根目录(含
go.mod的目录)下运行 - 加
-json参数可输出结构化数据,方便脚本处理:go list -m -json all - 若只想看直接依赖(不含 transitive),用
go list -m -f '{{if not .Indirect}}{{.Path}} {{.Version}}{{end}}' all -
all不是通配符,是特殊关键字,不能替换成./...或其他路径
查某个具体模块的详细信息用 go list -m -f
比如想知道 golang.org/x/net 在当前构建中实际用的是哪个 commit 或版本,就得靠模板格式化输出。默认只打印路径和版本,但 -f 可以提取 .Replace、.Indirect、.Time 等字段。
使用场景:确认是否命中了 replace 规则;判断某依赖是否为间接引入;检查模块发布时间是否异常老旧。
立即学习“go语言免费学习笔记(深入)”;
- 查替换信息:
go list -m -f '{{.Path}} => {{.Replace.Path}}@{{.Replace.Version}}' golang.org/x/net - 查是否间接依赖:
go list -m -f '{{.Path}}: {{.Indirect}}' golang.org/x/net - 注意
.Replace字段为空时不报错,但值为,模板里要加判断才安全
go list -f 解析包级信息时容易漏掉 -deps
想看某个 .go 文件所属包引用了哪些其他包,只写 go list -f '{{.Deps}}' ./pkg 是不够的——它只返回直接依赖,且不展开嵌套。真正要完整依赖图,必须显式加 -deps。
性能影响明显:对大型项目加 -deps 可能卡顿数秒,因为要遍历整个导入链;而漏掉它会导致你误判某个包是否真的被用到。
- 正确写法:
go list -deps -f '{{.ImportPath}}: {{.Deps}}' ./cmd/myapp - 如果只要包名不想要完整路径,用
{{.Name}}而非{{.ImportPath}} -
-deps和-json可共用,但 JSON 输出字段名与模板字段名不完全一致(如Deps→Depends),需查文档确认
区分 go list -m 和 go list 的作用域
前者操作模块(module),后者操作包(package)。混淆这两者是新手最常踩的坑:比如在模块外执行 go list ./... 会报 no Go files,但用 go list -m ./... 就直接报错语法无效——因为 -m 后只能跟模块路径或 all。
兼容性差异:Go 1.16+ 默认启用 module-aware 模式,go list 在 GOPATH 模式下行为不同,但现在几乎没人关它了;真正要注意的是 go list -m 不受 GOPATH 影响,只认 go.mod。
-
go list -m:只接受模块路径,如github.com/gorilla/mux,不接受相对路径或./... -
go list(无-m):接受包路径,如net/http、./internal/...,但要求当前在模块内或 GOPATH 中 - 交叉验证时别混用:想查
github.com/gorilla/mux的包结构?先go list -m确认它是否存在且版本正确,再go list github.com/gorilla/mux/...
模块路径和包路径在 go list 里是两套系统,名字一样但语义不同。很多问题不是命令不会用,而是没意识到它背后其实是两个独立的索引机制在工作。










