apt-cache depends --recurse 不能直接生成拓扑图,但可输出完整多级依赖文本;需经清洗去重、提取有向边(如 pkg -> dep)、保存为 DOT/CSV 格式,再用 Graphviz 等工具渲染成可视化拓扑图。

用 apt-cache depends --recurse 本身不能“一键导出拓扑图”,但它能生成完整的多级依赖文本数据,这是构建可视化拓扑图的必要基础。关键在于后续清洗、去重、格式转换和绘图——整个过程可脚本化,实现接近“一键”的效果。
一、获取干净的全层级依赖包列表
先执行递归查询,并过滤掉非包名干扰项(如版本号、括号、修饰字段):
apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends 包名 | grep -E '^[a-zA-Z0-9][^[:space:]]*$' | sort -u- 注意:
grep -E '^[a-zA-Z0-9][^[:space:]]*$'比简单grep "^\w+"更可靠,能排除空行、缩进、带括号的行(如<libssl1.1>)和注释行 - 输出是纯包名列表,每行一个,已去重,可直接用于下载或导入图工具
二、导出为标准依赖关系边列表(DOT 或 CSV)
若需绘图,需结构化为“源包 → 依赖包”这样的有向边。可用以下 shell 脚本片段提取(以 nginx 为例):
apt-cache depends --recurse --no-recommends nginx | awk '/^[[:space:]]*Depends:/ {gsub(/^[[:space:]]*Depends:[[:space:]]+|,|[[:space:]]*\(.*\)/,""); for(i=1;i<=NF;i++) if($i !~ /^</ && $i != "") print ENVIRON["PKG"] " -> " $i} /^[^[:space:]]+:/ {PKG=$1; sub(/:/,"",PKG)}' | sort -u- 该命令会输出类似:
nginx -> nginx-core、nginx-core -> libc6、libc6 -> ld-linux-aarch64.so.1等边关系 - 结果可保存为
deps.dot,供 Graphviz 渲染;或转为 CSV 供 Gephi / Cytoscape 导入
三、快速生成可视化拓扑图(Graphviz 示例)
安装 Graphviz 后,一行命令即可出图:
dot -Tpng deps.dot -o deps_topology.png && xdg-open deps_topology.png- 若图过大看不清,加布局优化参数:
dot -Tpng -Grankdir=LR -Nshape=box -Nfontsize=10 -Efontsize=9 deps.dot -o deps_topology.png(横向布局 + 小字体适配) - 对中间件如
kafka-server、redis-server或postgresql,建议先限制深度避免爆炸式展开:apt-cache depends --recurse --no-recommends --depth=3 包名
四、离线部署前验证依赖完整性
拿到包列表后,别急着画图,先确认所有依赖在当前源中都可获取:
-
apt-cache policy $(cat package_list.txt) 2>/dev/null | grep -B1 "Installed:" | grep -E "(^$|none|Candidate:.*none)" | grep -B1 "none" | grep "^$" -A1 | head -n -1 | grep -v "^$"—— 可批量检查哪些包缺失或不可用 - 更简洁方式:
for p in $(cat package_list.txt); do apt-cache show $p >/dev/null || echo "MISSING: $p"; done - 发现缺失包,说明需切换镜像源、启用 universe/multiverse,或手动补全 deb 文件


















