composer show 命令默认不显示 suggests 字段,仅对已安装包执行 composer show vendor/package 时才会在输出末尾列出其 suggests 内容;--tree 参数可将 suggests 作为子节点标注显示,但不支持批量或全局查看,且无 composer suggests 命令。

composer show 命令默认不显示 suggests
直接运行 composer show 或 composer show --all 都不会列出 suggests 字段内容——这不是 bug,而是设计如此。Composer 的 suggests 是包作者在 composer.json 中声明的“可选推荐依赖”,不参与安装决策,也不出现在依赖树里,所以常规命令压根不读取它。
用 composer show --tree 查看单个包的 suggests
只有对具体包执行 composer show 并加 --tree(或简写 -t)时,才会把它的 suggests 作为子节点打印出来,且明确标注为 (suggests):
composer show symfony/console --tree
输出中你会看到类似这样的行:
├── symfony/event-dispatcher (suggests) Symfony\EventDispatcher\EventDispatcherInterface
注意:--tree 只对单个包生效;composer show --tree 不带包名会报错。
批量提取所有已安装包的 suggests
要一次性看到当前项目所有已安装包各自的 suggests,得靠脚本组合。核心思路是:先列出所有已安装包名,再逐个调用 composer show <package> --tree</package> 并过滤含 (suggests) 的行:
- Linux/macOS 下可用一行 shell 实现:
composer show --installed --format=plain | cut -d' ' -f1 | xargs -I{} sh -c 'composer show {} --tree 2>/dev/null | grep "(suggests)"' - Windows PowerShell 替代方案:
composer show --installed --format=plain | ForEach-Object { $_.Split(' ')[0] } | ForEach-Object { composer show $_ --tree 2>$null } | Select-String "\s*\(suggests\)" - 注意:有些包没有
suggests,composer show会报错退出,所以加了2>/dev/null或2>$null屏蔽错误输出
为什么不能用 composer suggest 或 composer list suggests?
因为 Composer 根本没有叫 composer suggest 的内置命令,也不存在 suggests 相关的子命令。社区曾多次提过 feature request(如 #8725),但官方始终认为 suggests 是元信息而非功能入口,不值得单独暴露 CLI 接口。硬要“查全部 suggests”,只能绕道解析本地 vendor/composer/installed.json——但这文件结构不稳定,字段嵌套深,且包含未安装包的 suggests,容易误判。
真正容易被忽略的是:一个包的 suggests 仅在其 composer.json 中定义,跟是否已安装无关;但 composer show <package></package> 只对已安装包有效。没装过的包,即使写了 suggests,你也看不到。


















