composer怎么查看依赖层级关系_composer graph生成依赖图

5次阅读

composer graph 命令不存在,需用 composer show –tree 查依赖树或安装 composer-dependency-graph 配合 graphviz 生成可视化图谱。

composer怎么查看依赖层级关系_composer graph生成依赖图

composer graph 命令不存在,别白敲了

直接运行 composer graph 会报错:Command "graph" is not defined. —— 因为它根本不是 Composer 内置命令。你看到的教程或博客里写的这个命令,基本都依赖第三方插件,最常用的是 graphviz + composer-dependency-graphphpstan/dependency-injection 的衍生工具,但主流方案其实是 roave/composer-dependency-analyzer 配合可视化导出,或者更轻量的 composer show --tree

用 composer show –tree 看层级,够用且零依赖

这是 Composer 自带功能,不装插件、不配 Graphviz、不生成图片,但能清晰反映依赖嵌套结构,适合快速排查“谁拉了哪个版本的 monolog/monolog”这类问题。

  • composer show --tree:显示全部依赖树(含 dev 依赖)
  • composer show --tree vendor/package:只看某个包的依赖路径,比如 composer show --tree guzzlehttp/guzzle
  • 注意:如果某包被多个路径引入,--tree 只展示**第一次解析到的路径**,不会重复展开;想确认是否被多处引用,得配合 composer depends vendor/package
  • 输出中缩进代表依赖层级,但不体现版本冲突——比如 A → B v1.0C → B v2.0 同时存在时,这里只会显示其中一个,实际安装结果取决于 Composer 的版本约束求解器

真要画图?用 composer-dependency-graph + dot(Graphviz)

需要可视化图谱(比如向同事解释为什么升级 symfony/console 会连带更新十几个包),就得上外部工具。最稳定可用的是 composer-dependency-graph

  • 先全局安装:composer global require bitexpert/composer-dependency-graph
  • 确保系统已安装 dot(Graphviz 的命令行工具),macosbrew install graphvizubuntuapt install graphviz
  • 生成 PNG:composer-dependency-graph --format=png --output=deps.png
  • 常见坑:dot 默认对节点数有限制,大型项目容易报 Error: node too large,可加参数 --graph-attributes="size=10,10!" 缩小图幅,或改用 --format=svg 避开渲染限制
  • 生成的图里,箭头方向是「依赖指向被依赖」,即 A → B 表示 A requires B;但箭头粗细/颜色不表示强度或版本关系,纯拓扑结构

依赖层级深 ≠ 一定有问题,但得盯住“非直系”传递依赖

Composer 的自动扁平化(flattening)机制会让很多传递依赖被提升到根目录,composer show --tree 显示的层级未必等于 vendor/ 里的实际目录结构。真正危险的是那些没被提升、又没被显式声明的“深层嵌套依赖”,比如:

  • 你的 composer.json 没写 "monolog/monolog": "^3.0",但某个 v2.x 的 package-a 拉了 monolog/monolog: ^2.9,而你又用了 monolog v3 的新 API —— 运行时报 class not foundMethod not exist
  • 两个不同包分别要求 psr/log^1.0^2.0,Composer 通常能兼容,但如果其中一方用了 psr/log v2 特有的接口(如 LoggerInterface::log() 的第三个参数),v1 的实现就挂了
  • composer why-not vendor/package:version 检查某个版本为何无法安装,比硬看树更直接

依赖图越复杂,手动验证成本越高;与其纠结图形是否好看,不如定期跑 composer outdated + composer validate,再重点 review composer.lock 里变化的传递依赖段。

text=ZqhQzanResources