composer show vendor/package 可直接查看某包的 suggests 字段内容,但需该包已安装;官方无 composer suggests 命令,运行会报错;suggests 仅为提示,不参与依赖解析与安装流程。

composer show vendor/package 能直接看到某个包的 suggests
Composer 没有 composer suggests 这个命令,官方从没提供过。你真正能用的,是 composer show 加上具体包名——它会把 suggests 字段原样打出来,包括说明文字。
常见错误现象:运行 composer suggests 报错 Command "suggests" is not defined,因为这根本不是合法命令。
- 执行
composer show monolog/monolog,输出末尾会出现类似suggests: aws/aws-sdk-php (Allow sending logs to AWS services like CloudWatch) - 如果包还没安装,
composer show会提示找不到;必须先composer require或composer install过才查得到 - 注意区分
requires(强制依赖)和suggests(纯提示)——后者不会影响安装流程,也不会出现在依赖树里
批量提取所有已安装包的 suggests 需要解析 installed.json
想一次性扫完项目里所有包的建议项?composer show --installed 不会列出 suggests,它只显示包名和版本;真正存着完整 suggests 数据的是 vendor/composer/installed.json。
使用场景:维护老项目时快速发现可选扩展,比如看到 5 个包都建议 ext-redis,就说明缓存增强值得统一考虑。
- Linux/macOS 下可用
jq快速提取:jq -r '.packages[] | select(.suggests) | "\(.name) → \(.suggests | to_entries[] | "\(.key): \(.value)")"' vendor/composer/installed.json - 没装
jq?临时写个 PHP 脚本更可靠:php -r '$i = json_decode(file_get_contents("vendor/composer/installed.json"), true); foreach ($i["packages"] as $p) { if (!empty($p["suggests"])) { echo $p["name"] . ":\n"; foreach ($p["suggests"] as $k => $v) echo " - $k: $v\n"; } }' - 别信
composer show --installed | grep -A1 suggests——很多包的suggests是多行或被截断的,原始 JSON 才准确
suggests 字段不自动安装,但装了可能自动生效
suggests 只是提示,Composer 完全忽略它:不校验、不下载、不报错,连警告都没有。但它不是摆设——很多包在运行时会主动检测建议项是否存在,并启用对应功能。
容易踩的坑:装了 aws/aws-sdk-php,但 Monolog 日志没发到 CloudWatch,就以为“没生效”。其实可能只是没显式配置 Handler。
- 典型行为:类存在就加载(如
class_exists('Monolog\Handler\CloudWatchLogsHandler')),扩展存在就启用(如extension_loaded('redis')) - 装完建议包后,务必查原包文档——有些需手动注册服务、调用初始化方法,或改配置项才能触发增强逻辑
- PHP 扩展类建议(如
"ext-gd": "For image manipulation")必须真实启用,仅composer require无效;得确认php -m | grep gd有输出
自己写 composer.json 时怎么填 suggests 字段
如果你是包作者,suggests 是引导用户发现能力边界的窗口。填得太宽泛(比如列 20 个“理论上能配合”的包),反而降低可信度。
关键原则:只列你代码里真做了运行时检测、且适配过的项。模糊描述如“for better experience”毫无价值。
- 格式必须是关联数组:
"suggest": { "monolog/monolog": "For structured logging handlers", "ext-xml": "To parse XML responses from legacy APIs" } - 键可以是包名(
vendor/name)或 PHP 扩展(ext-xxx),不能写成suggest.ext-xml这种不存在的语法 - 值字符串里可提版本要求,比如
"psr/log": "v2 or v3 required for log middleware compatibility",避免用户装错版本白忙活
最常被忽略的一点:suggests 的内容不会出现在 composer.lock 或任何依赖解析环节里,它纯粹是面向开发者的文本提示。所以别指望靠它做自动化决策,也别因为它没出现就怀疑包有问题——它本来就不该出现。










