--no-dev不能解决平台扩展缺失问题,因为它只跳过dev依赖安装,不跳过对PHP版本、扩展等平台要求的校验;需用--ignore-platform-req=ext-xxx精准忽略特定扩展,保留其他校验。

composer install --no-dev 为什么不能解决平台扩展缺失问题
因为 --no-dev 只控制依赖包的安装范围,不跳过对 PHP 扩展、PHP 版本、INI 配置等平台能力的校验。即使你只装 require 中的包,Composer 仍会检查所有依赖(包括 require 里声明的)所要求的扩展是否存在。比如 ext-gd 被 monolog/monolog 的某个可选功能间接声明,它就会在 install 阶段报错。
如何让生产环境跳过 ext-* 检查但不破坏安全性
用 --ignore-platform-reqs 是最直接的方式,但它会跳过所有平台约束(php, ext-*, lib-*),风险不可控。更稳妥的做法是精准忽略:
- 只忽略特定扩展:
composer install --no-dev --ignore-platform-req=ext-imagick --ignore-platform-req=ext-xdebug - 保留 PHP 版本检查(防止运行在不兼容的 PHP 上):
--ignore-platform-req不加=后缀时才忽略全部;带等号才是按名排除 - CI/CD 中建议写成变量形式,避免硬编码:
composer install --no-dev ${COMPOSER_IGNORE_PLATFORM_REQS},由环境变量注入需要忽略的项
为什么 php -m 显示扩展已加载,composer 还报 missing
常见原因有三个:
- CLI 和 Web SAPI 使用了不同的
php.ini——composer走 CLI,而你验证时可能用了phpinfo()(Web 环境) - 扩展虽启用,但未满足版本要求,例如
ext-mbstring要求 >= 8.1.0,而你的是 8.0.30 -
composer.json中通过config.platform伪造了平台信息,导致实际环境被“降级”识别
验证方式:运行 php -c $(php --ini | head -1 | cut -d' ' -f4) -m | grep gd,确保和 Composer 实际读取的配置一致。
生产部署前必须检查的 platform 配置项
config.platform 是双刃剑:它能稳定构建过程,但也容易掩盖真实环境问题。
- 若设了
"php": "8.1.0",而线上是 8.0,则可能因语法差异(如枚举类型)直接 fatal error - 若设了
"ext-gd": "1.0.0",但线上没装 gd,composer install仍会成功,直到运行时imagecreatefrompng()报错 - 推荐策略:仅在 CI 构建阶段用
config.platform锁定 PHP 版本(用于测试兼容性),生产composer.json中不设该字段,靠真实环境兜底
真正容易被忽略的是:platform 配置一旦写进 composer.json,就会被 composer update 固化进 composer.lock 的 platform 字段,后续 install 会优先信任 lock 文件里的伪平台信息,而非当前机器的真实能力。











