composer show 默认列出所有已安装包的名称和版本,不显示描述、作者、依赖或PHP约束;查完整元数据须指定包名并加 -s(简介)、--tree(依赖树)、-a(远程所有版本)等参数。

composer show 能查到哪些包信息
直接运行 composer show 列出所有已安装包,但不显示版本约束、源地址或依赖树。真正有用的元数据得加参数——比如想看 monolog/monolog 的完整描述、最低 PHP 版本、支持的分支、是否弃用,必须指定包名:composer show monolog/monolog。
它默认只显示当前项目中已安装的包。如果包没装上(比如只是在 composer.json 里写了但没 install),会报错 Package not found。此时得换方式查远程元数据。
- 加
-s参数可显示该包所有可用版本(含未安装的) - 加
-a显示全部元数据字段,包括type、keywords、support等非核心字段 - 加
--format=json输出结构化 JSON,适合脚本解析
查未安装包的元数据:composer show -s 不够用怎么办
composer show -s 只列出版本号,不带 require、autoload 或 conflict 等关键字段。要查远程仓库里某个包某版本的完整定义,得用 composer show -a 加上精确版本号:
composer show laravel/framework v10.48.5 -a
但如果这个版本根本没被本地仓库缓存过,Composer 会卡住几秒甚至超时——因为要实时请求 Packagist API。这时更稳的方式是直接访问 https://packagist.org/packages/{vendor}/{package}.json,比如:https://packagist.org/packages/doctrine/dbal.json。返回的 JSON 和 composer show -a 基本一致,且包含 versions 数组和每个版本的 time、source、dist 等原始字段。
- 注意:Packagist 返回的
versions是按语义化版本倒序排列,但不一定包含所有 tag,有些版本可能被标记为abandoned - 若包使用了私有仓库,
composer show会失败,必须确认该仓库已在composer.json的repositories中正确定义
为什么 composer show 输出的 require 和实际安装不符
常见现象:执行 composer show symfony/console 显示 "php": "^8.0",但项目里 PHP 是 7.4,却仍能装上——这是因为 show 默认显示的是该包 最新稳定版 的 require,不是你本地装的那个版本。
解决方法只有两个:
- 先用
composer show symfony/console看当前装的版本号(比如v5.4.36),再补上版本号查:composer show symfony/console v5.4.36 - 或直接看
vendor/symfony/console/composer.json文件,这是最权威的本地元数据来源
另一个坑是 require-dev 永远不会出现在 composer show 输出里,哪怕你在本地开发环境装了 —— 它只反映 require 部分,跟 composer install --no-dev 的行为逻辑一致。
自动化解析元数据时该信谁:show、lock 还是 vendor/composer/installed.json
CI/CD 脚本里常需要提取包的 PHP 兼容性或类型(type: library vs type: metapackage)。别依赖 composer show 的输出格式,它会随 Composer 版本微调(比如 2.5+ 开始把 autoload 改成缩进显示)。最可靠的是读 composer.lock 或 vendor/composer/installed.json。
composer.lock 包含所有已安装包的精确版本、哈希值和 require,但不含 description 或 support;而 vendor/composer/installed.json 是 Composer 运行时生成的运行时视图,字段最全,且与 composer show -a 内容基本对齐,只是 JSON key 名略有差异(例如 version_normalized 而非 version)。
- 脚本中优先解析
vendor/composer/installed.json,前提是已执行过composer install - 若需离线分析,
composer.lock更安全,但得自己映射packages和packages-dev数组 -
composer show适合人工快速查,不适合写进自动化流程
元数据字段含义不统一才是真麻烦点:比如 type 字段在不同包里可能是 library、project、wordpress-plugin,没有全局枚举表,只能靠文档或试错理解。











