composer show 不加参数只显示直接依赖,查间接包需用 --tree 或 --all;包名须大小写及斜杠完全匹配,终端窄时缩进易错乱,推荐 --no-dev | less -S 配合精准 grep 过滤。

想用 composer show 快速筛出某个包,别直接裸跑命令——它默认不输出全量包列表,grep 很容易漏掉或匹配错。
为什么 composer show | grep xxx 常常查不到包?
composer show 不加参数时,只显示你 composer.json 中 require 和 require-dev 里明文声明的包(即直接依赖),不会列出 guzzlehttp/psr7 这类传递依赖。如果你 grep 的是间接包名,结果就是空。
- 想查所有已安装包(含传递依赖),必须用
composer show --tree或composer show --all -
--all只列包名+简短描述,不含版本或路径,适合快速扫名字;--tree输出完整依赖层级,适合定位“谁带进来的” - 包名大小写和斜杠必须完全匹配:
monolog/monolog≠Monolog/Monolog,psr/log≠psr-log - 终端宽度不足时,
--tree缩进可能错乱,加--no-dev | less -S更可靠
composer show --tree | grep 怎么避免误匹配?
直接 grep "log" 会把 psr/log、monolog/monolog、甚至 symfony/polyfill-php80(描述含 “log”)全打出来。得用锚点和上下文过滤。
- 精准匹配包名行:
composer show --tree | grep -E '^ [a-z0-9]+/[a-z0-9]+' | grep "psr/log" - 连带看它的父级依赖(谁引入的):
composer show --tree | grep -A1 -B1 "psr/log" - 只查从 root 向下展开的某条路径:
composer show --tree guzzlehttp/guzzle,不是全量扫描 - Windows PowerShell 用户注意:
grep要换成Select-String,且正则语法不同,-Pattern "psr/log"需加转义
查“谁依赖了我指定的包”,composer why 和 composer depends 有什么区别?
composer why vendor/package 是最轻量的反向查找,但它只返回一级上游(比如只告诉你 laravel/framework 依赖了 monolog/monolog),不递归到你的 composer.json。
-
composer depends --all monolog/monolog(Composer ≥2.5)能显示 root 项目本身是否直接 require,但需确认版本:旧版不支持--all,会静默忽略 - 如果
depends返回空,不代表没被依赖——可能是该包来自 path repository、手动复制,或composer.lock里有但未被 autoload 声明,此时得回退到composer show --tree | grep定位层级,再对上层包重复查 -
composer show -t | grep -B5 "monolog/monolog"比why多给两层上下文,肉眼判断更稳
真正容易被忽略的是:所有这些命令都依赖 vendor/ 和 composer.lock 存在且一致。刚 clone 项目还没 composer install,或者 lock 文件过期没更新,show 就会漏包或报错——先确保环境就绪,再筛。


















