suggest字段需在composer.json根级定义为对象,键为合法包名(如monolog/monolog),值为纯字符串说明,不可含版本号、数组或布尔值;提示仅在非静默的install/update成功后输出,不参与依赖解析与autoload。

composer.json里怎么写suggest字段
直接在根级加一个suggest键,值是对象,每个键必须是合法包名(如monolog/monolog),值只能是字符串说明,不能带版本号、不能是数组或布尔值。
常见错误:写成"monolog/monolog": "^3.0"——这会直接让Composer解析失败;或者写"ext-redis": true——布尔值不被接受,必须是字符串,比如"ext-redis": "启用 Redis 缓存驱动"。
- 包名要拼对,
guzzlehttp/guzzle不是guzzle/guzzle,psr/cache不是psr-cache - 扩展名用
ext-前缀,Composer能自动识别并检查是否已启用(如ext-redis) - 描述别写“可选”“推荐”,改用功能绑定句式,例如
"spatie/laravel-permission": "运行 php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" 后启用 RBAC 支持"
为什么装完没看到suggest提示
默认只在composer install或composer update成功结束后输出,且要求非静默模式。如果用了--quiet、--no-ansi,或命令被重定向(如> /dev/null),提示就完全消失。
另一个常见原因是:你执行的是composer require some/package,但该包自身的suggest只在它被首次安装时触发输出——后续再require其他包,不会重新刷出它的suggest。
- CI/CD中默认加了
--no-suggest,这是有意为之,不是配置错了 - IDE(如PHPStorm)的Composer插件基本不读
suggest,别指望它出现在依赖图或弹窗里 - 终端滚动太快导致提示被刷走?加
composer install --verbose能把输出放慢,或用composer install 2>&1 | tail -20快速回溯
如何让用户真正注意到并装上建议包
suggest本身不解决“没人看”的问题,它只是个安静的文本字段。想让它起作用,得靠外部手段补位。
最轻量有效的方式是在README.md顶部复述suggest内容,并附带可复制的命令:composer require monolog/monolog。比纯JSON字段多十倍的可见性。
- 在
post-install-cmd脚本里用PHP解析vendor/composer/installed.json,筛选出刚装的包的suggest,然后echo加粗提示(用[1;33mANSI色码) - 提供
bin/install-suggested可执行脚本,列出所有未安装的建议包,支持交互式选择(需用户手动运行) - 别依赖
composer show --all查suggest——它输出太杂,要用php -r '...'脚本直读installed.json才准
和require-dev、provide、replace的根本区别
suggest不参与任何依赖计算,连composer show --tree都搜不到它。而require-dev里的包会被加载进autoload,provide声明的虚拟包(如psr/log-implementation)会影响其他包的依赖满足判断,replace会从依赖图中移除被替代包。
最容易被忽略的一点:当你发现某个功能报Class not found,翻源码看到if (class_exists(...))分支,第一反应不该是“为什么suggest没自动装”,而是检查这个类是否真的在vendor/autoload.php里注册了——suggest连autoload都不碰,它安静得连错误都不会报。


















