composer why --tree 可展开完整依赖链,如 psr/log 的来源路径;composer prohibits 需结合 -vv 日志和 git grep 定位冲突源头;composer depends --tree 是识别隐式循环依赖的唯一可靠方法。

直接看 composer show --tree,但别只盯着它输出——它只反映已安装状态,不解释“为什么装了这个版本”或“谁在暗中拖后腿”。
查完整依赖链:用 composer why --tree,不是 composer why
composer why vendor/package 默认只返回一级来源,比如查 psr/log 可能只显示 monolog/monolog,但你真正需要知道的是:它是不是被 laravel/framework → illuminate/console → psr/log 这条链带进来的?
- 加
--tree才会展开整条路径:composer why --tree psr/log - 不加
--tree时,如果结果为空,不代表没人依赖它——可能只是没直接 require,而是被某个子依赖间接拉入 - 注意拼写:必须写全名
psr/log,不能写成psr-log或漏掉斜杠 - 若目标包未安装(
vendor/里没有),why会静默失败,先确认composer show | grep psr/log
定位冲突源头:别只信 composer prohibits 的文字,要追日志
composer prohibits vendor/package:version 输出的是一堆 require 规则,但它不告诉你这些规则来自哪个包的 composer.json。常见现象是看到 myproject requires php ^8.1,却不知道这是你写的,还是 symfony/console 硬编码的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先跑
composer show --platform确认当前 PHP 版本是否真不满足(有时只是platform配置没刷新) - 用
git grep "php.*8\.1" vendor/*/composer.json扫描已安装包的元数据(需vendor/已存在) - 加
-vv重跑composer update,重点看末尾几行:“Rejecting package X because it requires Y”、“conflict with Z”——这些才是 SAT 求解器的真实回溯路径 - 若涉及
require-dev,记得加--with-all-dependencies,否则prohibits默认忽略开发依赖
识别隐式循环依赖:composer depends --tree 是唯一实锤工具
Composer 不会在报错里明说“发现循环”,而是卡住、爆内存、然后退出。CPU 持续 95%+、内存每秒涨 50MB+,基本就是循环依赖的典型体征。
- 运行
composer depends --tree vendor/package(如myorg/core),若输出含myorg/core ← myorg/api ← myorg/core,箭头方向是“被谁依赖”,自身出现两次即闭环成立 - 必须有合法
composer.lock,否则命令报Package not found;可先删vendor/和composer.lock,再跑composer update --dry-run -v看求解器临终输出 - 80% 的隐式循环来自
require-dev中的 autoload 跨目录引用,比如phpunit/phpunit的 autoload 把你的../src/加进来了——检查所有vendor/*/composer.json里的autoload和autoload-dev - 临时注释掉
phpunit、infection等 dev 工具再试,比硬调求解器快得多
依赖树太乱?别画图,用 grep 定向挖
composer show --tree 默认输出靠空格缩进,深度超 4 层就成“缩进迷宫”。同名包不同版本也不标差异,容易误判。
- 聚焦核心依赖:加
--no-dev和--format=tree,composer show --tree --no-dev --format=tree - 定向追踪某个包:用
composer show --tree | grep -A 5 -B 5 "monolog/monolog",前后 5 行能看清它是被谁拉进来的 - 输出过长时加
| less -R(确保 Composer color = true),比网页可视化工具更快准 - 别依赖
composer graph类工具——它们依赖 Graphviz,且生成的图常把私有包、path 仓库解析错误,反而误导判断
最常被忽略的一点:所有命令(why、show --tree、depends)都基于 composer.lock 和 vendor/ 的当前快照,不是你 composer.json 里写的理想状态。改完 composer.json 后不 update 或 install,所有分析都是滞后的。










