composer show --suggests 可一次性列出所有已安装包的 suggest 字段内容,仅读取 vendor/ 下已安装包的 composer.json,不查远程数据。

composer suggests 命令能直接列出所有已安装包的推荐项
Composer 没有叫 composer suggests 的独立子命令,但自 Composer 2.2 起,composer show 支持 --suggests 参数(注意是复数形式),这才是查看建议的正确入口。运行它会一次性汇总当前项目中所有已安装包的 suggest 字段内容,比如:
composer show --suggests
输出类似:
laravel/framework suggests: symfony/console: For artisan commands monolog/monolog: For logging support guzzlehttp/guzzle suggests: psr/log: To enable logging middleware ext-zip: To enable ZIP response decoding
这个命令只读取 vendor/ 下已安装包的 composer.json,不查 Packagist 远程数据,所以结果完全反映你当前环境的真实依赖状态。
为什么 composer require 后没看到建议?检查是否静默模式或 CI 环境
很多开发者以为装完包就该看到提示,结果却什么也没输出——这通常是因为:
- 你在 CI 或 Docker 构建中用了
-q(quiet)或--no-ansi参数,suggest提示默认被抑制 - 你执行的是
composer update --no-interaction,而suggest只在 install/update 的“交互式”输出阶段显示(非错误流) - 某些包的
suggest字段写在require-dev包里,而你用--no-dev安装了生产环境,那些 dev-only 的建议就不会出现
验证方式:临时去掉所有静默参数,跑一次 composer install --verbose,就能看到完整建议流。
想查某个具体包的建议?用 composer show vendor/package
当你怀疑某个包可能漏掉了关键扩展(比如缓存、日志、命令行支持),但不确定它到底建议了什么,最准的方式是定向查询:
composer show laravel/framework
输出中会明确列出 suggests 小节。注意:composer show 默认只显示稳定版信息;如果该包尚未安装(比如你只是在 composer.json 里写了 require 但还没 install),它会报错“Package not found”,这时得先 composer install 或改用 composer search + 手动查 Packagist 页面。
常见误操作是把 suggest 和 require 混淆:比如看到 "ext-intl": "For better i18n" 就以为必须装,其实它只是可选增强,不装也不影响基础功能——除非你的代码里真调用了 intl 相关类且没做运行时判断。
别只看建议,要结合实际功能缺口反向排查
suggest 字段本身不会告诉你“你现在缺什么”,它只说“别人可能需要什么”。真正容易被忽略的点是:有些包把本该是 require 的东西错放进了 suggest,导致你运行时报错才意识到——比如某 SDK 建议 guzzlehttp/guzzle,但它的 HTTP 客户端逻辑根本没做空实现兜底,一调就炸。
实用做法:
- 遇到运行时报错如
Class 'GuzzleHttp\Client' not found,立刻查报错类所属包的composer show输出,确认它是否把 Guzzle 列在suggests里 - 用
composer depends vendor/package(Composer 2.5+)反查谁依赖了某个扩展,比如composer depends ext-pcntl,能快速定位是不是某个 dev 工具偷偷要求了你不需要的功能 - 定期运行
composer show --suggests | grep -E "(ext-|monolog|console|log)",过滤出扩展类和常用工具建议,人工核对是否已按需安装
最麻烦的情况是:建议包装了,但没生效——比如 Laravel 建议 symfony/console,你装了却还是不能跑 php artisan,那大概率是 vendor/bin/artisan 权限或自动加载没刷新,这时候 composer dump-autoload 比重装包更有效。










