composer why-not 仅用于定位目标包无法安装的首个硬性冲突源,不输出依赖树;它通过反向回溯 require、conflict 和 platform 约束,精准揭示“为什么装不上”,如 monolog/monolog 2.0.0 被 laravel/framework ^8.0 → guzzlehttp/guzzle ^6.0 阻塞,且必须指定精确版本号。

composer why-not 不是用来查依赖树的,它只回答“为什么装不上”——别混用。
composer why-not 的真实用途
它不是 composer show --tree 的替代品,也不输出任何依赖层级结构。它的唯一职责是:当 composer require 或 composer update 失败时,告诉你哪条约束拦住了目标版本。
- 输入必须带明确版本号,比如
composer why-not monolog/monolog 2.0.0;不写版本会静默退出 - 输出是反向依赖链 + 冲突原因,例如:
your-project -> requires laravel/framework ^8.0→laravel/framework 8.0 -> requires guzzlehttp/guzzle ^6.0→ 从而阻塞guzzlehttp/guzzle 7.0 - 它不关心包是否已安装——哪怕
composer show monolog/monolog报 “not installed”,why-not仍能查 - 依赖链只回溯到第一个冲突点,不会展开整棵树;中间某层出现
requires php ^8.1而你环境是 PHP 8.0,它就停在这儿
想看某个包的依赖树,该用哪个命令
用 composer show --tree,不是 why-not,也不是 depends。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查已安装包的完整依赖结构:
composer show --tree guzzlehttp/guzzle - 排除开发依赖干扰:
composer show --tree --no-dev monolog/monolog - 终端太窄导致缩进错乱?加管道:
composer show --tree --no-dev | less -S - 包还没装?加
--remote:composer show --remote --tree doctrine/orm - 注意:必须在含
composer.json的项目根目录运行,否则输出为空或报错
为什么容易误用 why-not 查依赖树
因为它的输出里有箭头(→)和缩进,看起来像树,但实际是线性阻塞路径。真正容易被忽略的是:
-
why-not不显示包自身的依赖项,只显示“谁在拦它” - 它不解析
provide或replace声明,遇到虚拟包(如psr/log)可能直接无输出 - 如果
composer.lock缺失或vendor/为空,why-not仍可工作,但show --tree会失效——两者数据源完全不同 - 升级 Composer 后,
why-not输出格式微调过,老教程里的截图可能少一行“PHP version”提示,别因此怀疑命令没跑成功
依赖树得靠 show --tree 看,冲突得靠 why-not 定位,两个命令干的事从底层逻辑就不重叠。混淆它们,等于拿螺丝刀当锤子使——不是不能敲,但敲歪了还得返工。

















