suggest 字段仅作文档提示,不参与依赖解析、安装或自动加载;需手动执行 composer require 才能安装,且不出现在 installed.json 中。

Composer 的 suggest 字段完全不安装包,只是文档提示——它连依赖图谱都不进,更不会自动下载或注册自动加载。
为什么 suggest 不能当“可选依赖”用
很多人看到 "monolog/monolog": {"suggest": {"aws/aws-sdk-php": "For S3 log transport"}} 就以为装了 monolog 就该顺带装 SDK,其实不是。Composer 在解析依赖、生成 autoload、执行 composer show --tree 或 composer depends 时,压根不看 suggest 字段。它甚至允许你写个根本不存在的包名(比如拼错成 aws/aws-sdk-pgp),也不会报错或警告。
-
suggest不参与任何安装决策,composer install或update完全无视它 - 即使包存在且可用,也必须手动运行
composer require aws/aws-sdk-php才会真装 - 它不出现在
vendor/composer/installed.json的元信息里,只在原始composer.json中作为纯文本存在
怎么查项目里所有 suggest 提示
Composer 命令行没有原生子命令列出全部 suggest,但有两个轻量可靠的方法:
- 直接打开项目根目录的
composer.json,看"suggest"键下的内容(适用于自己维护的项目) - 快速扫描已安装的所有包及其
suggest:运行php -r "$i = json_decode(file_get_contents('vendor/composer/installed.json'), true); foreach (\$i as \$pkg) { if (isset(\$pkg['suggest'])) { echo \"\n\$pkg[name]:\n\"; foreach (\$pkg['suggest'] as \$s => \$desc) echo \" \$s → \$desc\n\"; } }"
注意:这个脚本依赖 vendor/composer/installed.json —— 它由 Composer 自动维护,只要运行过 install 或 update 就存在,无需额外插件。
想让建议包“自动跟着装”,只有三种现实路径
别指望 --no-suggest 能控制安装行为——它只屏蔽终端最后一段提示文字,对 vendor 目录、lock 文件、autoload 零影响。真正要让建议包落地,得主动干预:
- 手动加进
require或require-dev:查目标包的composer.json,复制你想用的suggest条目,再执行composer require vendor/package - 用社区插件辅助,比如
boekkooi/composer-suggest-plugin,它会在install/update时交互询问是否安装建议项(注意确认兼容 Composer 2.x+) - 检查该建议是否已被作者“转正”:有些包新版已把关键建议移入
require-dev(如某些测试驱动),此时只需升级包版本,suggest就失效了
最常被忽略的一点:很多 suggest 其实是功能开关而非硬依赖。比如 ext-zip 被建议,往往意味着“启用 ZIP 功能时需要”,而不是“不装就跑不起来”。要不要装、什么时候装,得结合你的实际使用路径判断,而不是看提示就照单全收。










