<p>Composer install卡在“ext-gd * is required but not installed”是因为它在依赖解析前调用extension_loaded('gd')校验扩展是否真实启用,而非仅检查系统是否安装库;require中的ext-gd是硬性运行时约束,必须满足才能生成vendor/autoload.php。</p>

Composer 没有“平台包”这个官方概念,ext-xxx、php、lib-xxx 这些都不是包,而是平台要求(platform requirements),它们不从 Packagist 下载,也不进 vendor/,只用于环境校验。
为什么 composer install 会卡在 “ext-gd * is required but not installed”?
因为 Composer 在解析依赖前,会调用 extension_loaded('gd') 检查扩展是否真实加载。它不关心你有没有装 GD 库,只看 PHP 是否报告该扩展已启用。
- 常见误操作:Dockerfile 里装了
libgd-dev,但忘了docker-php-ext-install gd或漏 reload 配置 - Windows 用户常忽略
php.ini中extension=php_gd2.dll是否取消注释,且 DLL 文件真实存在 -
composer diagnose不查这个,它只管json、openssl等 Composer 自身依赖的扩展;而ext-gd是项目级要求,只在install/update/check-platform-reqs时触发 - 绕过检查(如加
--ignore-platform-reqs)能让命令跑通,但运行时调用imagecreate()仍会直接Fatal error
config.platform 和 require 中的 php/ext-xxx 有什么区别?
require 里的 "php": "^8.2" 或 "ext-zip": "*" 是硬性运行时约束,安装时必须满足;而 config.platform 是“声明式覆盖”,告诉 Composer “我假装运行在某个平台上”,仅影响本次命令的匹配逻辑,不改写 composer.json。
- 典型场景:CI 构建机是 PHP 8.0,但项目要求 8.2+,你不想升级构建机 PHP,就用
composer install --config-platform.php=8.2.0 - 注意值类型:
--config-platform.ext-gd=1表示“存在”,=0表示“不存在”,不能写true/false或空字符串 -
config.platform无法绕过某些底层限制,比如 Composer 2.5+ 要求 PHP ≥7.4,哪怕你--config-platform.php=7.2,命令本身就会启动失败
如何快速确认当前环境满足所有平台要求?
别靠 composer diagnose,它完全不看这些。用 composer check-platform-reqs —— 它专为这事设计,输出清晰,且默认只检查生产依赖,避免 dev 包干扰判断。
- 基础用法:
composer check-platform-reqs(检查require+config.platform) - 要连
require-dev一起验(比如部署前做全量检查):composer check-platform-reqs --with-dependencies - 输出示例:
php: 8.1.27 (64 bit) does not satisfy php ^8.2→ 说明要么升级 PHP,要么删掉config.platform.php让检查回归真实环境 - 它比
install --dry-run更轻量:不下载包、不读 lock、不生成 autoload,纯做布尔判断
真正容易被忽略的是:平台要求校验发生在依赖解析之前,一旦失败,vendor/autoload.php 根本不会生成——所以别在报错后还去 php -l vendor/autoload.php,那个文件压根不存在。


















