composer tree 命令默认不存在,因它并非 Composer 内置命令,而是历史插件遗留混淆;官方推荐使用 composer show --tree 查看已安装依赖树,支持指定包名(如 monolog/monolog)并显示其实际依赖路径。

composer tree 命令为什么默认不存在
因为 composer tree 不是 Composer 内置命令,它是 composer-cli 插件(更准确说是 hirak/prestissimo 时代遗留的混淆)——真正可用的是第三方插件 phpstan/dependency-analyser 或更主流的 deptrac,但最轻量、最直接的方案其实是 Composer 自带的 composer show --tree。
常见错误现象:composer tree 报错 Command "tree" is not defined,或装了旧版插件后与 Composer 2+ 不兼容,导致 composer update 失败。
-
composer show --tree是官方支持、无需安装插件、开箱即用的方式 - 它只显示当前
composer.lock中已解析的实际依赖(不是composer.json的声明式依赖) - 不支持过滤、缩进控制或导出为图片,但足够快速定位循环引用或意外升级路径
如何用 composer show --tree 查看指定包的依赖路径
比如你想知道 monolog/monolog 是被谁拉进来的,以及它又带了哪些子依赖:
composer show --tree monolog/monolog
输出类似:
monolog/monolog 2.10.0
├── php (>=7.2.5)
├── psr/log (1.1.4)
└── symfony/polyfill-php80 (v1.29.0)
└── php (>=7.2.5)
注意点:
- 参数必须是已安装的包名(区分大小写),
composer show --tree foo/bar对未安装包会报Package not found - 不加包名时显示整个依赖树,可能极长;建议配合
grep或less:composer show --tree | grep -A5 "guzzlehttp" -
--tree不识别--depth参数,想限制层级只能靠外部工具截断
替代方案:用 deptrac 生成可视化图(dot/svg)
当需要导出为图片、分析跨包调用、或排查“为什么这个 dev-only 包出现在生产环境”时,composer show --tree 就不够用了。这时推荐 deptrac(PHP 写的静态分析工具,专注依赖规则):
安装:
composer global require sensiolabs-de/deptrac
初始化配置:
deptrac init
然后运行分析(默认只检查 autoload 部分,如需完整依赖关系,得手动在 deptrac.yaml 中添加 collector: composer 规则)
容易踩的坑:
-
deptrac默认不读取composer.lock,它分析的是代码中use和new的实际引用,和 Composer 运行时依赖不是一回事 - 想生成 SVG 图需额外装 Graphviz,并确保
dot命令在 PATH 中 - 对大型项目,首次运行可能卡住几分钟,且报告里大量“uncovered”不代表有问题,只是未定义规则
为什么别轻易用 composer-visualizer 这类在线工具
有些网页工具(如 composer-visualizer.herokuapp.com)要求你上传 composer.json 或 composer.lock,看似方便,但存在两个硬伤:
-
composer.lock包含包的 exact commit hash 和 dist URLs,可能暴露内部私有包结构或镜像地址 - 它们用 PHP 在服务端执行
composer install --no-scripts --no-plugins模拟解析,但无法还原你本地的平台配置(如platform.php)、插件行为或自定义 installer,结果常有偏差 - 一旦项目用了
pathrepository 或package类型定义,这些工具基本无法处理
真正需要图形化时,优先本地跑 composer show --tree + 导出文本,再用 VS Code 插件(如 “Tree View”)折叠浏览;复杂依赖冲突,直接上 composer why-not vendor/package:version 更快。










