composer show 不加参数时仅列出 composer.json 中 require 和 require-dev 显式声明的已安装包,不包含传递依赖,读取 vendor/composer/installed.json 反映当前真实安装状态。

composer show 不加参数时到底列哪些包
默认只显示 composer.json 中 require 和 require-dev 里**显式声明**的包,不展开任何子依赖。它读的是 vendor/composer/installed.json,不是 composer.lock,所以反映的是当前 vendor/ 的真实安装状态。
常见误解是以为它列出“所有已安装包”,其实像 psr/http-message、symfony/polyfill-* 这类传递依赖根本不会出现——除非你手动 require 过它们。
- 如果
vendor/为空(比如刚 clone 项目),命令直接报错:Could not find package - 想看全部已安装包(含传递依赖),必须加
--tree或-a;-a还会包含平台包(如ext-curl) -
composer show --name-only(Composer 2.5+)可快速提取纯包名列表,适合脚本处理
查单个包详情:为什么必须写全名且区分大小写
composer show vendor/package-name 是唯一能拿到该包完整元数据的方式,包括 autoload 映射、scripts、type、require 列表、源码地址等。但前提是包**已实际安装进 vendor/**,且名字完全匹配。
错误示例:composer show Monolog/Monolog 或 composer show monolog 都会报 Package not found——Composer 包名强制小写 + 斜杠分隔,且不自动补全。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 输出中的
versions行显示的是当前装在vendor/里的确切版本(如v3.5.0、dev-main或带 commit hash 的 dev 版) -
type字段决定是否参与自动加载:library可 autoload,metapackage通常无代码,project是根项目本身 - 若包只在
require-dev里,又用了--no-dev安装,则查不到
用 --tree 看依赖链时容易误读的三个点
composer show --tree 展开的是当前 vendor/ 和 composer.lock 的快照结构,不是 composer.json 的理想依赖图。缩进层级表示引入路径,但有几个关键限制:
- 默认只显示运行时依赖(
require),要包含开发依赖得加--dev - 遇到
provide声明(如psr/log被monolog/monolog提供),树会中断——这不是 bug,是 Composer 虚拟包机制的正常行为 - 输出不体现版本冲突或约束未满足问题;那些得靠
composer prohibits或composer why-not - 终端宽度太窄时缩进被截断,建议搭配
less -S查看:composer show --tree | less -S
为什么 show 显示的版本和 composer.lock 对不上
这是最常被忽略的差异根源:composer show 读 vendor/composer/installed.json(实际安装内容),而 composer.lock 是上次 install 或 update 时的快照。两者不一致,往往意味着:
- 手动删过
vendor/但没重新install - 执行了
composer update --lock或composer update --no-install,只更新了 lock 文件,没重装包 -
composer.lock被手动修改或未提交,导致本地状态漂移
真正复杂的地方在于:Composer 的依赖解析是动态上下文敏感的,show --tree 输出的是“此刻 vendor 里有什么”,不是“理论上应该有什么”。如果你发现某个包在 composer.lock 里有记录,但 show 查不到,先 ls vendor/ 确认目录是否存在——别跳过这一步。










