最稳查“谁依赖当前包”用composer show --who;composer depends常查不到因只扫项目composer.json显式声明,不读vendor包json,且对大小写、斜杠敏感,版本低于2.5未定义,遇provide/replace/path即跳过。

直接看“谁依赖了当前包”,用 composer show --who 最稳;composer depends 在多数场景下不可靠,容易漏判、报错或返回空。
为什么 composer depends 经常查不到包?
它只扫描你项目 composer.json 中显式写的 require 和 require-dev,不递归读取 vendor/ 里每个已安装包的 composer.json。这意味着:
- 如果某个包是被
laravel/framework带进来的,而你没在自己的composer.json里写它,composer depends就完全看不见 - 遇到
provide(如psr/log-implementation)、replace或本地path仓库时,它大概率静默跳过 - 包名大小写敏感、必须带斜杠、不能缩写——输成
monolog而非monolog/monolog就会报Could not find package - Composer 版本低于 2.5 时,
depends命令默认不存在,运行直接报Command "depends" is not defined
composer show --who 怎么用才准确?
它直接遍历所有已安装包的 require 字段,不绕弯、不依赖版本特性,结果确定可预期:
- 查谁直接依赖
psr/log:composer show --who psr/log - 排除开发依赖干扰(生产环境推荐):
composer show --who --no-dev psr/log - 结果为空 ≠ 没人用 —— 可能是通过虚拟包间接提供,此时应回头跑
composer show -t . | grep -B2 -A2 "psr/log"手动定位 - 它只显示一级上游(比如
monolog/monolog),不会继续往上翻到your-project-name;真要溯源到自己写的require,得接上composer why --tree
依赖树里看到包,但 show --who 查不到?
常见于以下情况:
- 该包实际由另一个已安装包通过
provide声明“虚拟提供”,比如monolog/monolog提供psr/log-implementation,但它的composer.json里没写psr/log在require中 - 包被手动复制进
vendor/,或来自未声明的path仓库,installed.json有记录,但无对应require声明 -
composer.json改过但没运行composer update,vendor/composer/installed.json是旧快照,和当前声明不一致 - 终端宽度太窄导致
composer show -t .缩进错位,误判层级关系;临时用composer show -t --no-dev | less -S横向查看更准
真正关键的不是命令名字有多酷,而是你是否清楚自己想问的是“谁声明了它”还是“谁最终装了它”——前者用 show --who,后者得靠 show -t 全局扫一遍,再人工比对。











