必须加参数才能查看Composer包详细信息:-s显示autoload/scripts,--tree展开依赖树,--all查远程所有版本;包名须全写、在项目根目录执行,且依赖composer.lock完整性。

直接运行 composer show 不会给你想要的“详细信息”——它默认只输出一行版本号,或静默失败。真要看 autoload、依赖树、PHP 兼容性,必须加参数,且包名要写全、路径要对、目录要在项目根。
查已安装包的完整元数据:必须加 -s(--show-config)
不加 -s 时,composer show monolog/monolog 只返回 monolog/monolog 3.5.0,连类怎么加载都看不到。真正调试 autoload 映射、确认 scripts 钩子是否注册,得强制加 -s:
-
composer show -s monolog/monolog会显示"Monolog\": "src/"这类 autoload 规则,对应到vendor/monolog/monolog/src/Logger.php - 同时列出
scripts字段里的命令(如post-install-cmd),方便验证是否被正确载入 - 这个选项在 Composer 2.2+ 才稳定支持;旧版本会报
unrecognized option,别硬试 - 如果包只在
require-dev里,且你执行过composer install --no-dev,它就不会出现在结果中
看依赖树:必须用 --tree,不能只靠默认输出
composer show laravel/framework 只显示顶层信息,完全看不出它拉了哪个 symfony/console、后者又带了哪个 psr/log。真实依赖路径只能靠 --tree 展开:
-
composer show --tree laravel/framework输出缩进结构,例如:└── psr/log 3.0.0,层级关系一目了然 - 它只反映当前
composer.lock解析出的实际安装路径;若某包只在require-dev且用了--no-dev,就不会出现在树中 - 输出太长时别手动翻,直接管道过滤:
composer show --tree | grep "guzzle" - 注意:不是所有依赖都会展开到叶子节点——有些只在
require-dev且未启用时,整条分支就直接消失
查远程所有可用版本:必须用 --all,-a 是无效别名
想确认 guzzlehttp/guzzle 是否有 v8.x、最新版是否支持 PHP 8.3,就得绕过本地缓存,直连 Packagist API:
-
composer show --all guzzlehttp/guzzle返回所有版本号、发布时间、是否稳定,但不显示每个版本的完整composer.json -
-a是无效别名,会被忽略;必须写成双横线--all - 结果受
composer.json中repositories配置影响——私有源没配,就查不到私有包 - 查私有包时,
--repository后的 URL 必须是合法的 packages.json 地址,填 Git URL 或网页地址会报Could not parse version constraint
包名写错或目录不对时,composer show 往往静默失败
输成 symfony/consoole>、漏掉 vendor(如只写 monolog)、大小写错误(Monolog/Monolog),默认都不报错,也不提示,直接空输出。只有加 -v(verbose)才看到 Package not found:
- 必须写全
vendor/package-name,比如monolog/monolog,不能省略monolog/ - 必须在项目根目录(含
composer.json和composer.lock的目录)下执行,否则依赖解析失败 -
composer show强依赖composer.lock完整性——如果 lock 文件损坏或被删,很多查询会退化为只查缓存甚至失败 - 前缀匹配可行(如
composer show monolog),但不支持模糊搜索;想按关键词找,得用composer show --all | grep -i cache
最容易被忽略的是:所有这些行为都基于当前 composer.lock 的快照,而不是实时源状态;哪怕 Packagist 上刚发布了新版本,只要没 composer update,--tree 和 -s 就不会体现它。











