composer show -t 层级混乱因默认展开全部依赖且不区分直接/间接依赖;应使用 --direct、指定包名或 --no-dev 精准查看,composer depends 仅查声明依赖,未声明的包需通过 show -t | grep 反向追踪。

composer show -t 看依赖树时为什么层级混乱?
默认 composer show -t 会从 root 包开始展开全部依赖,但不区分“直接依赖”和“间接依赖”,容易淹没关键路径。比如你只装了 monolog/monolog,结果树里混着 psr/log、symfony/polyfill-php80 甚至 composer/xdebug-handler(来自 Composer 自身),根本看不出自己写的代码到底链到了谁。
实操建议:
- 加
--direct只看自己require里写的包:composer show -t --direct - 查某个具体包的上游依赖:用
composer show -t vendor/package(如composer show -t guzzlehttp/guzzle) - 避免被 dev-only 包干扰:加上
--no-dev,尤其在生产环境分析时 - 注意输出宽度限制——终端太窄时树形缩进会被截断,可临时用
composer show -t --no-dev | less -S
composer depends 查不到包?提示 “not found in your dependencies”
这是最常踩的坑:composer depends 默认只查当前项目的 require 和 require-dev,**不扫描已安装但未声明的包**。比如你手动 cp 过一个包进 vendor/,或者用了 path repo 但没在 composer.json 里写 require,它就完全看不见。
常见错误现象:
-
composer depends foo/bar返回空或报错,但ls vendor/foo/bar确实存在 - 依赖树里有
foo/bar,但depends查不到谁拉它进来
原因通常是:它被另一个已安装包作为子依赖带进来的,而那个“父包”本身没出现在你的 composer.json 中(比如是某 SDK 的嵌套依赖)。这时得反向追踪:
- 先用
composer show -t | grep foo/bar定位它在哪一层 - 再对上层包执行
composer show -t upper/package,逐级往上翻 - 如果涉及私有包或 path repo,确认
composer.json的repositories配置是否生效,composer update -v时有没有警告 “skipped”
vendor/composer/installed.json 能不能当权威依赖源?
不能直接信。这个文件是 Composer 安装后生成的快照,内容取决于当时执行 install 或 update 的上下文,**不反映当前 composer.json 的声明意图**。比如你删掉一个包但没运行 composer update,installed.json 里还留着它;反之,如果你改了 composer.json 但没更新,它又会滞后。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
使用场景要分清:
- 调试时快速查某个包的版本和安装路径:可以读,但得配合
composer show package/name交叉验证 - 写脚本自动化分析?别直接 parse 它——优先用
composer show --format=json,输出结构稳定且含依赖关系字段 - 想导出“实际生效”的依赖列表(含锁版本):用
composer show --locked --format=json,这才是composer.lock的机器可读版
性能影响很小,但兼容性要注意:老版本 Composer(installed.json 字段名不统一,show --format=json 从 1.7+ 才稳定支持完整依赖图。
分析大型项目依赖爆炸,怎么快速定位可疑包?
依赖层级深 ≠ 有问题,但“被引用次数异常高”或“版本碎片化”往往是隐患源头。比如 psr/container 出现在 12 个不同版本里,说明各包对规范实现不一致,迟早冲突。
实操建议:
- 统计每个包被多少其他包依赖:
composer show --tree | awk '{print $1}' | sort | uniq -c | sort -nr | head -20 - 查版本碎片:
composer show --format=json | jq -r '.packages[] | select(.name | startswith("psr/") or startswith("phpunit/")) | "\(.name) \(.version)"' | sort - 识别“幽灵依赖”:运行
composer why-not some/package:1.0.0,看哪些已装包在阻塞升级 - 注意 autoload 冲突点:某些包把类放在非标准命名空间却没配
autoload,导致 Composer 自动加载失败,这类问题不会出现在依赖树里,得结合composer dump-autoload -v日志看
复杂点在于:有些包通过 replace 或 provide 声明替代关系,composer show 不会自动展开解释,得人工对照 composer.json 里的字段判断是否真冲突。

















