唯一稳定命令是composer show --tree,用于查看已安装包的依赖树;查谁依赖某包优先用composer why --tree或composer show --who;composer depends为实验性功能,默认关闭且存在provide/replace识别缺陷,不建议日常使用。

查已安装包的依赖树,唯一稳定命令是 composer show --tree;查谁依赖了某个包,优先用 composer why --tree 或 composer show --who;composer depends 是实验性功能,默认关闭、容易漏判,不建议日常使用。
为什么 composer depends 经常查不到东西
这个命令从 Composer 2.4 才加入,但默认禁用。必须先执行:composer config experimental.show-depends true
否则直接运行 composer depends monolog/monolog 会报错或静默无输出。
即使开了实验开关,它仍存在几个硬伤:
- 遇到
provide(如"psr/log": "*")时,不会把提供者算作“依赖方” - 对
replace或本地path类型仓库基本不识别 - require-dev 中的包,若未实际安装进
vendor/,它就当不存在
换句话说:它查的是“声明了直接 require”的包,但连 Composer 自己解析依赖时都绕不开虚拟包和替换逻辑 —— 这个命令却假装它们不存在。
composer why --tree 才是溯源真相的关键
你想知道 monolog/monolog 为什么出现在你的项目里?composer why monolog/monolog 默认只返回 laravel/framework 这一级,但你真正要确认的是:它是不是你自己在 composer.json 的 require 里写的?
必须加 --tree:
-
composer why --tree monolog/monolog输出末尾出现your-project-name dev-main→ 源头是你自己 - 末尾带
[dev]→ 来自require-dev - 树在某一层中断(比如停在
symfony/console就没了)→ 那个包用了provide psr/log,没继续向下展开,属正常行为
不加 --tree,等于只看了半张地图。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer show --who 查“谁直接声明依赖它”,干净不绕弯
想快速知道哪些已安装包在自己的 composer.json 里写了 psr/log?用:
-
composer show --who psr/log→ 列出所有直接 require 它的包(含require-dev) -
composer show --who --no-dev psr/log→ 排除开发依赖,专注运行时链路
注意:--who 只显示“直接声明者”,比如 A → B → C,它只列 B,不列 A。这不是缺陷,是设计:它回答的是“谁写了这行 require”,不是“谁最终加载了它”。
如果结果为空,别急着删包 —— 先跑 composer show --tree | grep psr/log 看全局结构,可能是被某个包通过 provide 间接提供的。
未安装包也能查依赖,但得用 --remote
评估要不要装 doctrine/orm,又怕它拖进一堆旧版组件?不用先 require 再 remove:
-
composer show --remote --tree doctrine/orm→ 查它远程声明的完整依赖树 -
composer show --remote --direct doctrine/orm→ 只看它composer.json里require的那一层
这个操作不碰本地 vendor/ 和 composer.lock,纯读 Packagist API,安全、轻量。但注意:远程信息不含版本冲突判断,真实安装时仍可能因约束不兼容而回退或失败。
真正容易被忽略的点是:所有这些命令,都依赖当前目录下有有效的 composer.json,且 composer.lock(对 --tree)或网络连通性(对 --remote)必须就位。少一个条件,输出就不可信。










