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

composer show -p 的作用很明确:只列出当前项目中被识别为“平台包”(platform packages)的已安装项,比如 php、ext-zip、lib-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 -p 和 show --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 pdo或php -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() 用。










