composer如何查看某个包是否支持你的PHP版本?(show –platform-check详解)

2次阅读

composer show –platform-check 仅粗筛平台兼容性却不报具体冲突,需用 composer why-not php:x.x 定位不兼容包、composer depends –tree 查依赖链、php -m 验证扩展,并注意 config.platform 的伪版本干扰。

composer如何查看某个包是否支持你的PHP版本?(show –platform-check详解)

composer show –platform-check 会报错但不告诉你具体哪不兼容

它只返回一个模糊的 Platform check failed,连哪个包、哪个 PHP 扩展、哪个版本范围冲突都不列。这不是 bug,是设计如此——composer show 本意是查包信息,--platform-check 只是顺带做一次粗筛,不是诊断工具。

真正要定位问题,得换命令:

  • 先用 composer why-not php:8.2(把 8.2 换成你实际的 PHP 版本)看哪些包直接声明了不兼容
  • 再用 composer depends --tree vendor/package-name 查某个包被谁依赖,避免误删“无辜中间层”
  • 如果报错里提到扩展(比如 ext-intl),运行 php -m | grep intl 确认是否已启用,别只信 phpinfo() 页面

packagist.org 上看到的 PHP 版本范围不一定准

网页上显示的 php: ^7.4 || ^8.0 是包作者在 composer.json 里写的,但没经过实际安装验证。常见陷阱有:

  • 作者写了 "php": "^8.0",但代码里用了 str_contains()(PHP 8.0+),却忘了加 ext-mbstring 依赖,而你的环境没开这个扩展
  • 包本身兼容 PHP 8.2,但它依赖的某个子包(比如 monolog/monolog 的某个旧版)只到 PHP 8.1,Composer 就会卡住
  • 某些包用 config.platform.php 强制降级平台声明,这时 composer show --platform-check 看到的是假版本,不是你真实 PHP

为什么 vendor/autoload.php 能加载,但 composer install 还失败?

autoload 只管类自动加载,不校验平台兼容性。哪怕所有类都能 require 进来,只要 composer.json 里声明的 phpext-* 不匹配,composer install 就会中止。

立即学习PHP免费学习笔记(深入)”;

典型表现:

  • 本地开发能跑,CI 流水线失败 → CI 的 PHP 版本或扩展列表和你本地不同
  • composer update 成功,但 composer install 失败 → composer.lock 锁的是旧版依赖,新版约束更严
  • 加了 --ignore-platform-req=php 临时绕过,但上线后某函数报 undefined function → 忽略不是解决,是掩盖

检查时别漏掉 config.platform 配置

项目根目录 composer.json 里如果有 "config": {"platform": {"php": "7.4.33"}},那所有平台检查都按这个走,跟你 php -v 输出无关。这是为了在高版本 PHP 上模拟低版本环境,但容易让人误以为“我 PHP 是 8.2,怎么还报 7.4 不兼容?”

快速确认方法:

  • 运行 composer config --list | grep platform,看有没有被覆盖
  • 临时去掉该配置,再跑 composer show --platform-check,对比结果
  • 如果团队共用,建议把 config.platform 写进 README,否则新成员永远猜不到为啥本地装不上

事情说清了就结束。最常被忽略的其实是 config.platform 和扩展缺失这两点,它们不会出现在报错第一行,但总在最后才被想起来。

text=ZqhQzanResources