goland不支持一键导出完整依赖图,需明确是模块级(go mod graph)、包级(importgraph)或服务级(运行时埋点)依赖,三者技术路径完全不同。

GoLand 本身不支持“一键导出完整依赖图”的功能,所谓“完整依赖关系”需先明确定义:是模块级(go.mod 声明)、构建时实际参与编译的包级(import),还是运行期服务调用链?三者完全不同,导出方式也完全不一样。
GoLand 的 Modules 图表只能导出当前上下文的依赖子图
它不是全量图,而是按需渲染:
- 右键某个
.go文件 → “Show Dependencies Diagram”,图中只包含该文件在当前构建配置下实际 import 的包及其传递依赖(含_和.导入) - 右键项目根目录 → “Show Dependencies Diagram”,默认只显示
go.mod中顶层require模块,不展开间接依赖,也不含replace后的本地路径 - 图表无法直接导出为 PNG/SVG —— GoLand 只提供截图(
Ctrl+PrintScreen)或复制为图片(右键 → Copy Diagram to Clipboard),没有“Export as PNG”菜单项 - 若图为空,先确认:
GO111MODULE=on是否生效、go list -json -deps ./能否成功执行、是否启用了//go:build ignore等导致包被跳过
想导出模块级依赖图,得用命令行 + Graphviz
go mod graph 是唯一能批量获取模块依赖边的原生命令,但它输出的是纯文本,不能直接喂给 dot:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 必须清洗:每行形如
github.com/a/b github.com/c/d@v1.2.3,DOT 格式要求节点名加双引号,且需声明digraph和node [shape=box] - 简单清洗示例(bash):
echo "digraph G { node [shape=box];" && go mod graph | sed 's/ / -> /' | sed 's/@[^ ]*//g' | sed 's/^/"/; s/$/"/' | sed 's/ -> /" -> "/' && echo "}"再管道给dot -Tpng -o deps.png -
go mod graph不处理replace和exclude,图里仍显示原始模块路径;若项目用了replace github.com/x/y => ./local,图中不会出现./local,容易误判 - 大型项目建议加
head -n 500截断,否则生成的 PNG 可能达百兆且无法打开
包级依赖(import 级)要用 importgraph,不是 go mod
模块图反映的是“谁声明了谁”,而 importgraph 才反映“谁真正 import 了谁”:
- 安装:
go install github.com/kisielk/importgraph@latest(注意不是旧版kisielk以外的 fork) - 运行:
importgraph -format dot ./... | dot -Tpng -o imports.png,它会扫描所有.go文件的import语句,包括vendor/下的包和条件编译(//go:build)生效的路径 - 它能发现同模块内子包之间的依赖(如
net/http/httputil→net/http),这是go mod graph完全看不到的 - 但
importgraph不识别_导入的副作用包(比如_ "database/sql"不会触发驱动注册的依赖),这类依赖必须靠go list -f '{{.Deps}}' .或运行时分析
别把依赖图当成服务拓扑图
无论模块图还是 import 图,都只是静态代码分析结果:
-
go.mod里有github.com/Shopify/sarama≠ 服务真连 Kafka;import "database/sql"≠ 实际用 MySQL 驱动 - 真正的服务间调用关系由配置决定:
config.yaml中的db.url、环境变量KAFKA_BROKERS、甚至 feature flag 开关都会改变运行期依赖 - 如果目标是导出生产环境的服务拓扑,必须在客户端埋点(
http.RoundTripper、grpc.UnaryClientInterceptor),上报含Protocol、TargetService、Environment的结构化数据,再聚合生成图
真正要导出“完整依赖关系”,得先说清你要的“完整”指哪一层 —— 模块、包、还是服务。三者技术路径完全不同,混用只会导出一张看似热闹、实则误导的图。










