composer install卡在“resolving dependencies”是因依赖递归爆炸,即暴力回溯所有版本组合求解约束,导致cpu/内存飙升、长时间无响应;应通过--no-plugins --no-scripts -v、why-not、depends --tree、replace/provide及校准platform-config定位并收敛求解空间。

为什么composer install卡在 Resolving dependencies 不报错
不是网络问题,是 Composer 在暴力回溯所有可能的版本组合——尤其当二级依赖(即子依赖的依赖)被多个顶层包以不同约束拉入时,解析路径呈指数级增长。比如 symfony/console 被 7 个 dev 包和 3 个生产包同时引入,且各自要求 ^5.4、^6.0、dev-main,Composer 就得穷举所有交集可能。
- 用
composer install -v观察:如果停在Resolving dependencies超过 30 秒且无后续日志,基本可判定是解析风暴 - 检查是否启用了
roave/security-advisories或旧版composer-unused插件,它们会在每次解析时强制重载整个依赖图 - 本地 PHP 版本与
composer.json中"platform": {"php": "8.2"}不一致时,Composer 会反复排除不兼容版本,拖慢过程
怎么快速定位哪几个二级依赖在“拱火”
别信 composer show --tree——树深超过 5 层后输出动辄上千行,关键路径早被淹没。真正有效的办法是倒查枢纽节点:
- 先跑
composer depends --tree --max-depth=2 monolog/monolog,看谁在拉它;重点盯那些被 ≥5 个不同顶级包引用的包(如psr/log、symfony/polyfill-php81) - 执行
composer why-not php:8.2(替换为你实际 PHP 版本),它会直接列出所有阻止升级的间接依赖及其完整路径,比手动翻 tree 快 10 倍 - 对可疑包运行
composer show vendor/package-name,确认它当前安装的版本是否被多个分支同时 require —— 比如guzzlehttp/psr7同时被guzzlehttp/guzzle:^7和aws/aws-sdk-php拉入,但前者锁^1.8,后者要^2.0,就必然冲突
replace 和 conflict 怎么用才不翻车
这不是“跳过检查”的捷径,而是主动收口搜索空间。前提是确认代码已适配,否则 runtime 报错更难排查。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在根
composer.json的replace字段里加"psr/log": "3.0.0",Composer 就不再尝试安装其他psr/log版本——但你得确保所有代码(包括第三方包的扩展逻辑)都兼容 v3 - 用
conflict封杀已知不兼容组合,例如"conflict": {"monolog/monolog": "=10.0.0"},能直接跳过那些注定失败的组合 - 避免写
"replace": {"*": "*"}或模糊通配符,Composer 会忽略;必须写全名+具体版本号
为什么删了 require-dev 还有 dev 包残留
composer install --no-dev 只跳过 require-dev 顶层声明的包,不剔除它们的传递依赖。比如你删了 phpunit/phpunit,但它依赖的 sebastian/exporter 若同时被 monolog/monolog 使用,就会照常安装。
- 验证是否干净:运行
composer show --installed | grep -i "phpunit\|phpstan\|cs-fixer",有输出就说明没清干净 - 真正可控的方式是配合
Dockerfile构建阶段:先composer install --no-dev,再rm -rf vendor/phpunit vendor/phpstan(仅限明确知道这些包无任何生产依赖) - CI 流水线中加校验步骤:
! composer show --installed | grep -q "roave/security-advisories",防止误装
二级依赖失控最麻烦的地方不在安装慢,而在它让 composer.lock 变得不可预测——同一份 composer.json,在不同 PHP 版本或插件环境下生成的 lock 文件可能完全不同。所以与其事后补救,不如从第一次 composer require 就限制约束粒度,比如用 ^2.10.5 替代 ^2.0,少留一个松动接口,解析压力就少一层。










