Composer 升级本质是用户触发的依赖求解过程,非工具自身升级;卡在“Resolving dependencies…”是 SAT 求解器穷举版本组合所致,应优先用 composer update --dry-run -v 排查。

Composer 本身没有“版本升级指南”这种官方文档,它的行为完全由 composer.json 和 composer.lock 驱动;所谓“升级”,其实是你在改约束、删 lock、跑 update 时触发的一次依赖求解过程——不是 Composer 自己在升,是你在指挥它重算。
composer update 卡在 “Resolving dependencies…” 怎么办
这不是网络慢,是 SAT 求解器正在穷举满足所有约束的版本组合。常见诱因:
- 同时 require 多个大生态包(如
laravel/framework+symfony/console+doctrine/orm),每个包有几十个可选版本,搜索空间爆炸 -
composer.lock没删就改了composer.json,求解器被迫以旧 lock 为起点做“最小变更”,反而锁死可行路径 -
config.platform.php设为"8.1.0",但实际运行环境是8.2.5,大量合法版本被提前剪枝 - 混用稳定性标记:
"monolog/monolog": "dev-main"和"phpunit/phpunit": "^9.6"冲突,后者要求 stable 版本,求解器直接放弃
真正有效的排查方式只有一种:composer update --dry-run -v。它不改任何文件,但会把求解过程完整打印出来:哪些包被升级/降级、主版本号是否变化、有没有触发新的 conflict 提示。
CHANGELOG.md 对 Composer 完全没用
Composer 不读、不解析、不验证 CHANGELOG.md。它只认 composer.json 里的 version 字段,或 Git tag(如 v2.1.0)。你翻半天日志发现没写某次修复,问题往往出在:
- 你装的不是那个 tag 对应的版本(
composer show guzzlehttp/guzzle看实际安装版本) - CHANGELOG 没和 tag 对齐(比如 tag 是
v2.1.0,但 CHANGELOG 里只有v2.0.0段落) - 写了“优化性能”这种模糊描述,而不是“
HttpClient::send()默认超时从 30s 降为 10s”
必须严格按 Keep a Changelog 规范写,别自己发明结构。Laravel、Symfony、Monolog 全都这么干,工具链也只认这个。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么 composer install 秒出,update 却要算半天
install 根本不跑求解器。它只校验 composer.lock 里的每个包版本是否仍满足当前 composer.json 中的约束——这个校验是 O(n) 的快速比对。
composer.lock 不是缓存,是上一次成功求解输出的「已验证可行解」,包含精确版本、源类型、SHA256 校验和、依赖映射等完整快照。只要 lock 文件没坏、仓库元数据没变、平台配置一致,install 就永远快。
容易踩的坑:
- 改了
composer.json但忘了composer update,CI 上composer install依然装旧版本,且不报错 - 手动编辑
composer.lock后直接install,下次update会覆盖你的修改 - 删掉
composer.lock再install,会退化成一次不受控的update,哪怕你只是多敲了一个空格导致content-hash不匹配,也会触发警告甚至失败
别用 apt install composer
Ubuntu 官方源里的 php-composer 包不是 Composer 官方维护的,更新严重滞后(截至 2026 年 6 月,LTS 系统仍普遍是 2.2.22),且存在三个硬伤:
-
composer --version看着正常,但一跑composer install就崩:缺ZipArchive或PharData类,本质是php-zip和php-phar没装全 - 不支持
^2.5这类现代依赖约束,Laravel 11+、Symfony 7+明确拒绝旧版解析器 - 安装后
/usr/bin/composer可能残留,和你手动装的/usr/local/bin/composer冲突,which composer找到的往往是旧版本
必须用官方脚本安装,并校验 SHA384:EXPECTED_CHECKSUM="$(curl -sS https://composer.github.io/installer.sig)",跳过校验等于把整个依赖链的信任基础交出去。

















