Composer show -p命令详解 查看已安装的平台包【工具】

7次阅读

composer show -p 只列出平台包(如php、ext-zip),即由PHP环境提供而非Composer安装的虚拟依赖;其结果基于PlatformRepository,受config.platform配置或运行时检测影响,不反映vendor内容。

Composer show -p命令详解 查看已安装的平台包【工具】

composer show -p 的作用很明确:只列出当前项目中被识别为“平台包”(platform packages)的已安装项,比如 phpext-ziplib-curl 这类由运行环境提供、并非通过 Composer 下载的依赖。

什么是平台包?为什么 show -p 只显示它们

平台包是 Composer 用来建模 PHP 运行时底层能力的一组虚拟包。它们不对应实际的 vendor/ 目录文件,而是由 composer.json 中的 config.platform 或当前 PHP 环境自动推导而来。执行 composer show -p 时,Composer 不查 installed.json,而是查 PlatformRepository 实例里的注册项。

  • php 版本来自 PHP_VERSION 常量,或你手动在 config.platform.php 中锁定的值
  • ext-* 包(如 ext-mbstring)是否出现,取决于 extension_loaded() 检测结果,或 config.platform.ext-xxx 显式声明
  • lib-*(如 lib-iconv)依赖 PHP_BINDIR 和系统命令探测,部分不可靠,尤其在容器或精简镜像中容易漏报

show -pshow --platform 是一回事吗

是的,--platform-p 的完整写法,两者完全等价。但注意:它和 composer show(无参数)行为截然不同——后者默认只显示 require 中声明且已安装的非平台包;而 -p 会跳过所有这些,只输出平台维度的“能力声明”。

  • 如果你在 CI 中跑 composer show -p | grep ext-pdo 判断扩展是否可用,得确认该环境确实加载了 pdo 扩展,否则不会出现在输出里
  • config.platform 里写的值会覆盖真实环境检测结果,比如设 "platform": {"php": "8.1.0"} 后,show -p 就永远显示 php 8.1.0,哪怕你实际跑在 PHP 8.2 上
  • 没有 config.platform 且扩展未启用时,show -p 输出可能为空——这不是 bug,是设计如此

常见误用与排查建议

很多人用 show -p 想验证扩展是否“可用”,结果发现没输出或输出不符预期,问题往往不在命令本身。

  • 运行前先确认 php -m | grep pdophp -i | grep 'pdo.*enabled',排除扩展根本没加载
  • 检查 composer.json 是否意外写了 "platform": {"ext-pdo": false} —— 这会导致该扩展被显式排除出平台列表
  • docker 中使用多阶段构建时,composer show -p 在 build 阶段运行,但扩展只在 runtime 阶段加载,此时输出不可信
  • show -p 不受 COMPOSER_NO_INTERACTION=1 影响,但它受 COMPOSER_CACHE_DIR 无关,因为平台信息不走缓存

真正要注意的是:平台包列表反映的是 Composer “认为”的运行能力,不是操作系统或 PHP 解释器“实际暴露”的全部能力。它只是个契约快照,用于依赖解析时做版本约束判断。别把它当 phpinfo() 用。

text=ZqhQzanResources