composer如何查看包的依赖关系图?(graphviz可视化方案)

3次阅读

composer-unused 配合 graphviz 可生成反向依赖图,支持 –reverse 调整箭头方向,但需手动处理私有包路径。

composer如何查看包的依赖关系图?(graphviz可视化方案)

composer dependents 命令不显示依赖图,得换工具

Composer 自带的 composer show --tree 只能看当前项目的依赖树,没法反向查“谁依赖了这个包”,更不能生成可视化图。想看某个包(比如 monolog/monolog)被哪些其他包间接或直接引用,必须借助第三方插件。

用 graphviz + composer-unused 插件生成依赖图

推荐用 composer-unused 配合 Graphviz 渲染,它能扫描整个 vendor 目录,识别实际被 require 的包,并导出为 .dot 文件。注意:它默认只分析“被代码引用”的包,不是单纯看 composer.json 里的声明。

  • 先全局安装:composer global require composer-unused/composer-unused
  • 生成 dot 文件:composer-unused --format=dot > deps.dot
  • 用 Graphviz 渲染:dot -Tpng deps.dot -o deps.png
  • 如果提示 Command 'dot' not found,说明没装 Graphviz,macosbrew install graphvizubuntuapt install graphviz

graphviz 输出图里箭头方向容易误解

Graphviz 默认画的是“被依赖方向”:箭头从 A → B 表示“B 依赖 A”,也就是 A 是被 B 用的。这点和日常说的“依赖关系”语序相反,很多人第一眼会读反。比如图中 laravel/frameworksymfony/console,意思是 Laravel 框架用了 Symfony 控制台组件,不是反过来。

  • 想改成“依赖方向”(即 A → B 表示 A 依赖 B),得加 --reverse 参数:composer-unused --format=dot --reverse > deps.dot
  • dot 文件里节点名默认是包名全称(含 vendor 名),但不带版本号;如果要区分版本,得改用 composer-show-dependencies 插件,但它不支持 dot 导出
  • 大项目生成的图可能太密,建议先限定范围:composer-unused --include="monolog/monolog" --format=dot

别指望 composer.lock 或 vendor/autoload.php 自动生成完整依赖图

composer.lock 只记录最终解析出的包版本和哈希,没有依赖路径信息;vendor/autoload.php 是运行时加载器,也不含结构关系。硬解析这些文件写脚本,既不可靠又难维护——已经有现成工具,没必要重复造轮子。

真正麻烦的是私有包或 path repo:如果本地开发用 "type": "path" 引入未发布包,composer-unused 默认跳过它们,得加 --scan-path 手动指定目录。这点很容易漏,图一出来就缺关键节点。

text=ZqhQzanResources