composer show -t是当前最稳定、无需插件的依赖树命令,读取vendor/和composer.lock真实快照,需在含composer.json的项目根目录运行,指定包名如composer show -t guzzlehttp/guzzle可查具体依赖。

直接用 composer show -t(注意是短横线 -t,不是 --tree)查已安装包的依赖树,这是当前最稳、无需插件、不看版本猜谜的方案。 它读的是 vendor/ 和 composer.lock 的真实快照,不是你 composer.json 里写的“愿望清单”。
为什么 composer show --tree 不工作?
这不是你输错了,是命令本身在不同 Composer 版本中反复横跳:--tree 参数在 2.2.0 引入,部分 2.2.x 小版本删了它,到 2.5.0+ 彻底移除。你现在看到 Unrecognized option: --tree 或静默无输出,大概率就是这个原因。
验证方式很简单:composer --version。若低于 2.2.0,运行 composer self-update;若已是 2.5.0+,别再试 --tree,直接切到 -t。
-
composer show -t是唯一稳定支持的短参数,等价于旧版composer show --tree的意图 - 不加包名会输出整个项目依赖树(几百行起步),建议指定目标:
composer show -t guzzlehttp/guzzle - 终端宽度太窄时缩进被截断,可用
composer show -t --no-dev | less -S横向滚动查看
composer show -t 查不到包?先确认三件事
报 Package not found 或空输出,90% 是环境没就绪,不是命令失效。
-
vendor/目录必须存在且非空——没跑过composer install或composer update就会失败 -
composer.lock文件得有内容,否则无法还原已解析的依赖快照 - 包名必须精确:大小写、斜杠、vendor 名一个都不能错,比如
monolog/monolog不能写成Monolog/monolog或monolog
如果包只在 require-dev 里,而你加了 --no-dev,它自然不会出现——这点常被忽略。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
想查“谁在依赖某个包”?别用 depends,用 composer show --who
composer depends 是实验功能(2.4+ 默认关闭),遇到 provide、replace 或本地 path 仓库时容易漏判;而 composer show --who 直接扫描所有已安装包的 require 字段,干净确定。
- 查谁显式依赖
psr/log:composer show --who psr/log - 排除开发依赖:
composer show --who --no-dev psr/log - 它只显示“直接声明者”,比如 A → B → C,
--who只列 B;要看到 A,得配合composer show -t B往上翻
如果 --who 返回空,不代表没人用——可能是某包通过 "provide": {"psr/log": "*"} 虚拟提供,此时必须回 composer show -t 全局扫一遍。
依赖树里看到旧版本?那不是 bug,是冲突妥协结果
比如你在 composer.json 写了 "guzzlehttp/guzzle": "^7.0",但 composer show -t 显示的是 v6.5.8,说明其他已安装包强制要求 v6,Composer 已自动降级并锁进 composer.lock。
-
composer show -t展示的是“最终落地版本”,不是“你想要的版本” - 要定位谁在卡版本,得立刻补查:
composer why guzzlehttp/guzzle看第一层来源,再加--tree往上溯源 - 若源头结尾带
[dev],说明来自require-dev,上线前记得用--no-dev重装验证
真正麻烦的不是树形结构本身,而是某一层突然中断——比如停在 laravel/framework 就没了,大概率是它用了 provide 声明虚拟包,实际实现藏在另一个包里,这时候只能靠 grep 扫 composer.lock 或手动翻源码。


















