composer install 卡在 resolving dependencies 超过30秒即大概率是循环引用,可通过 --dry-run -v 查看重复路径、depends --tree 发现闭环链路、检查 autoload 隐式引用三步确认;破环须抽离契约包、运行时解耦或降级为可选依赖。

Composer install 卡在 Resolving dependencies 超过 30 秒,基本就是循环引用实锤——它不会报错说“检测到循环”,而是死循环回溯,CPU 拉满、无网络请求。
怎么一眼确认是循环引用,不是版本冲突
看三个现象:
- 执行
composer update --dry-run -v,末尾几行反复出现同一路径,比如vendor/a → vendor/b → vendor/a - 报错里出现类似
Package a depends on b, which depends on a的描述(注意不是“conflict”,是“depends on … which depends on”) -
composer depends myorg/core --tree输出中出现myorg/core ← myorg/api ← myorg/core(箭头方向是“被谁依赖”,自身出现两次即闭环)
用 composer depends --tree 定位真实闭环链路
这是唯一能看清间接环的命令,但有两个硬前提必须满足:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目必须已成功运行过
composer install(保证composer.lock有完整快照) - 必须加
--tree参数,否则composer depends vendor/a只显示一级依赖,根本看不到环 - 如果提示
Package not found,说明该包没进composer.lock——先composer clear-cache,再删掉vendor/和composer.lock,重跑composer update --dry-run看第一步失败点
检查 autoload 和 autoload-dev 引入的隐式循环
很多“循环”根本没写在 require 里,而是靠自动加载悄悄打通的:
-
phpunit/phpunit的composer.json里写了"autoload": {"psr-4": {"App\": "../src/"}},就把你的src/加进了它的加载路径;而你的代码又用了它的TestCase,运行时就形成隐式闭环 - 你自己的
autoload-dev错误地把vendor/下的路径也写进去了——等于告诉 Composer:“我依赖我自己” - 验证方法:临时注释掉
composer.json中所有非核心的require-dev条目(如phpunit/phpunit、infection/infection、phpstan/phpstan),再跑composer update --dry-run;如果不再卡住,问题就出在这里
真正有效的破环方式只有三种
没有 --force、没有 --ignore-platform-reqs、没有“跳过循环”的选项:
- 抽离契约包:把双方共用的接口、DTO、异常类拎出来,建新包
myorg/contracts,然后myorg/core和myorg/api都只require "myorg/contracts": "^1.0",删掉彼此的require - 运行时解耦:A 不再
new B()或use BSomeClass,而是定义interface ServiceInterface(放契约包里),B 实现它,A 通过容器或工厂获取实例——此时 A 的composer.json里彻底删掉对 B 的require - 降级为可选依赖:如果 B 只在 A 的测试里用(比如 Mock 数据),就移到
require-dev;如果是增强功能(如导出 Excel),改用suggest字段提示用户手动安装
最容易被忽略的是 autoload 的越界引用——它不报错、不提示,却让依赖图在加载阶段就闭环。哪怕 composer.json 看起来干干净净,只要 autoload 或 autoload-dev 里有 ../src/、../../ 这类路径,就可能埋下循环伏笔。










