composer show -t .是Composer 2.2+唯一稳定依赖树命令,必须带.表示当前项目根包,否则仅输出顶层包名;--tree已弃用,--no-dev须前置,输出中[vX.Y.Z]为实际安装版本。

直接用 composer show -t .,别写 --tree,否则报错。 这是当前 Composer 2.2+ 的唯一稳定命令,--tree 已被弃用,composer tree 虽存在但需 ≥2.2 且部分旧环境不兼容,composer show --tree 在 2.4+ 会明确提示 Unrecognized option "--tree"。
为什么 composer show -t 必须带点号(.)?
不加 . 时,composer show -t 默认只列出顶层包名,不展开任何依赖树——它把 . 当作“当前项目”这个虚拟根包来解析依赖链。漏掉就会白跑命令,输出看起来像没生效。
-
composer show -t .:完整树(含所有 require 和 require-dev 中实际安装的包) -
composer show -t --no-dev .:排除开发依赖,更贴近生产环境 -
composer show -t monolog/monolog:只展开该包及其下游,适合查子依赖爆炸问题 - 错误写法:
composer show -t --no-dev .中--no-dev放在-t后面会失效,必须前置
依赖树里看到两个 symfony/console 版本,真冲突了吗?
不一定。树中重复出现同名包,只说明不同上游包各自声明了约束(比如 A 要 ^5.4,B 要 ^6.2),Composer 最终安装的版本以 composer.lock 为准——看最后一级缩进旁的方括号内容,例如 [v5.4.32] 才是真实加载版本。
- 若树中某包出现多次且末级版本不一致(如一处标
[v5.4.32],另一处标[v6.2.10]),说明锁文件未同步或存在强制降级,得运行composer update - 如果
vendor/symfony/console目录不存在,那树里显示的只是“曾被请求”,不代表已安装 -
composer show symfony/console可验证该包是否真被加载、路径在哪、autoload 是否注册
想快速定位“谁把我拉进来的”,别硬扫树
composer show -t . 输出动辄几百行,人工找来源效率低还易看错缩进层级。真正要查某个包(如 psr/log)是怎么进项目的,优先用:
-
composer why psr/log:返回直接依赖它的包(例如laravel/framework) -
composer why --tree psr/log:向上追溯到你自己的composer.json,末尾出现your-project-name dev-main才算确认源头 -
composer show --who psr/log:比why更底层,扫描所有已安装包的require字段,不走依赖解析器,结果更确定 - 注意:
composer depends是实验性命令(2.4+ 默认关闭),遇到provide或本地 path 仓库容易漏判,慎用
最常被忽略的一点:所有树命令读的都是 vendor/composer/installed.json,不是 composer.json。刚 composer require foo/bar 后立刻跑 show -t .,如果跳过了 install 或用了 --no-install,新包绝不会出现在树里——先检查 vendor/foo/bar 目录是否存在,这是比命令更快的验证方式。











