suggest字段非可选依赖,仅为终端提示;包名须合法精确(如guzzlehttp/guzzle),值必须为纯字符串描述(≤12词),且需匹配代码中class_exists或extension_loaded等实际使用逻辑。

suggest字段不是可选依赖,它只是一行终端提示,写错或写空等于没写。
包名必须合法且拼写精确
Composer 会严格校验 suggest 键名是否为合法包名格式(如 monolog/monolog),不接受别名、短名或错误前缀:
-
guzzle/guzzle❌ —— 正确是guzzlehttp/guzzle -
psr-cache❌ —— 正确是psr/cache -
redis❌ —— 扩展推荐必须用ext-redis -
libicu❌ —— 系统库推荐应为lib-icu(注意连字符)
拼错会导致该条目被完全忽略,且不会报错;Composer 解析时直接跳过非法键名。
值只能是字符串,禁止版本号与布尔值
suggest 的值必须是纯字符串,任何其他类型都会破坏 JSON 结构或被静默丢弃:
-
"monolog/monolog": "^3.0"❌ —— 版本约束无效,且可能触发JSON decode error -
"ext-redis": true❌ —— 布尔值不被接受,必须写成"ext-redis": "To use Redis as cache backend" -
"phpunit/phpunit": ["^10.0"]❌ —— 数组非法,解析失败
描述文字建议控制在 12 个词以内,聚焦“装了能干什么”,而非“它是什么”。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
描述要绑定具体动作或运行时条件
模糊描述(如“可选依赖”“推荐安装”)几乎没人读;有效描述需明确触发前提和用户动作:
- ❌
"symfony/console": "Recommended for CLI tools" - ✅
"symfony/console": "Enables php:command commands after registering ConsoleServiceProvider" - ✅
"ext-gd": "Required to generate thumbnails; fallbacks disabled if extension_loaded('gd') returns false" - ✅
"spatie/laravel-permission": "Run php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" to enable RBAC"
如果代码里有 class_exists('MonologLogger') 或 extension_loaded('redis') 分支逻辑,这条 suggest 才算合理;否则它只是噪音。
避免跨生态强推与循环依赖暗示
suggest 是单向提示,不是契约。乱推无关生态会降低可信度:
- 在 Symfony 组件里写
"laravel/framework": "For Laravel integration"❌ —— 用户大概率不用,且无实际集成代码支撑 - 包 A
suggestB,B 又suggestA ❌ —— 容易让用户困惑主次,也暴露设计耦合不清 - 把开发期工具(如
phpstan/phpstan)写进主包的suggest❌ —— 应移入require-dev的suggest,或直接删掉
真正需要的建议,通常不超过 3 条;超过说明功能边界模糊,该拆包而不是堆 suggest。
最容易被忽略的一点:你写的 suggest 在用户执行 composer require your/package 时只出现一次,之后升级、重装、CI 构建全都不再显示——除非你把它同步写进 README、INSTALL.md 或 post-install-cmd 脚本里。










