报错卡在Resolving dependencies就是循环依赖,非网络或缓存问题;须用composer depends --tree定位闭环(如myorg/core ← myorg/api ← myorg/core),再通过抽离契约包、运行时解耦或降级为可选依赖实现单向依赖。

报错卡在 Resolving dependencies 就是循环依赖,不是网络或缓存问题
Composer 一看到依赖图里存在闭环(比如 myorg/core → myorg/api → myorg/core),就会用 SAT 求解器反复回溯,直到超时后抛出模糊错误,如 Root package cannot be installed 或 Your requirements could not be resolved。这不是版本没选对,也不是你本地网慢——执行 composer update --dry-run -v,盯最后 10 行,如果反复出现同一组包来回引用(package-a v1.2.0 requires package-b ^2.0 → package-b v2.3.0 requires package-a ^1.0),就是实锤。
用 composer depends --tree 定位闭环,但必须满足两个硬前提
这个命令是唯一能看见箭头方向的诊断工具,但它不会在“空项目”里工作:
- 必须在已成功执行过
composer install的项目里运行,否则composer.lock不完整,依赖图缺失 - 必须带
--tree参数,不加就只显示一级依赖,根本看不到间接环 - 若提示
Package not found,说明该包压根没进composer.lock——它早在解析阶段就被拦截了,此时先删掉vendor/和composer.lock,再跑composer update --dry-run看第一步失败点
例如怀疑 myorg/core 被循环引入,运行:composer depends myorg/core --tree
输出中若出现 myorg/core ← myorg/api ← myorg/core,箭头方向是“被谁依赖”,同一包名出现两次即闭环。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
最容易被忽略的隐式循环:autoload + require-dev 组合陷阱
你没在 require 里写互引,但照样爆红。常见原因是某个 require-dev 包(比如 phpunit/phpunit)在自己的 composer.json 里写了:"autoload": {"psr-4": {"App\": "../src/"}}
它把你的 src/ 加进了它的自动加载路径;而你的代码又用了它的类(比如 PHPUnitFrameworkTestCase),运行时就形成逻辑闭环。
- 临时注释掉
require-dev下所有非核心工具(phpunit/phpunit、phpstan/phpstan、infection/infection),再试一次composer update - 检查所有
require-dev包的composer.json,搜"../src"、"../../myproject/src"这类路径 - 确认你的
autoload-dev没把vendor/下的路径写进去——这等于告诉 Composer:“我依赖我自己”
真正有效的破环只有三种,没有“跳过”或“强制安装”
所有靠谱方案都指向一个目标:让依赖方向变成单向。任何 --ignore-platform-reqs 或手动改 vendor/ 都只是掩盖问题,下次更新照样崩。
-
抽离契约包:把共用的接口、DTO、异常类拎出来建新包(如
myorg/contracts),它的composer.json中"require": {}应为空;myorg/core和myorg/api都只require "myorg/contracts": "^1.0" -
运行时解耦:
A不再new B()或use BClass,而是定义LoggerInterface(放契约包),B实现它,A通过容器获取实例;此时A的composer.json里必须删掉对B的require -
降级为可选依赖:如果
B只在A的测试中用,移到require-dev;如果是增强功能(如导出 Excel),改用suggest字段提示用户手动安装
闭环一旦形成,靠删缓存、换镜像、升级 Composer 版本都解决不了——它不是安装问题,是结构问题。最常被跳过的动作,其实是检查 autoload 和 require-dev 的越界引用,而这恰恰是多数人第一次排查时直接忽略的环节。

















