Composer update 拉不到新版本主因是多层元数据缓存及 composer.json 中的隐性约束;需依次清理 ~/.composer/cache/repo/https---packagist.org/、vendor/composer/installed.json 和 composer.lock,并检查 minimum-stability、prefer-stable、PHP 版本及 conflict/replace 声明。

composer update 为什么总拉不到新版本?
不是网络慢,也不是 Packagist 没发布,而是 Composer 在多个位置缓存了旧的 metadata,导致它“以为”没有可用更新。最典型的表现是:你明明看到某包在 Packagist 上已发布 v2.1.0,但 composer update vendor/package 死活不升级,甚至 composer show vendor/package 还显示 v2.0.3。
必须清理的三个缓存位置
只跑 composer clear-cache 不够,它不碰远程元数据快照和本地安装快照:
-
~/.composer/cache/repo/https---packagist.org/—— 这里存着packages.json和所有provider-*.json,是 Composer 解析“有哪些版本可选”的源头 -
vendor/composer/installed.json—— 记录当前已装包的精确版本与来源,composer show直接读它;若没刷新,就永远看不到新版本 -
composer.lock—— 它不是缓存,但会硬性锁定旧版本;不删它,composer update默认只在 lock 约束内找“兼容更新”,根本不会查新版本
执行顺序不能错
清理后必须重走完整解析链,否则旧快照仍可能被复用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先删
composer.lock和vendor/composer/installed.json(保留vendor/目录可选,但建议一并清) - 再删
~/.composer/cache/repo/https---packagist.org/(composer clear-cache可留着,它主要清 zip 包,不影响 metadata) - 最后跑
composer update --dry-run -v看输出里是否出现Downloading https://packagist.org/packages.json或新版本号;没看到,说明某处缓存还在生效
容易忽略的隐性约束
即使缓存全清,composer update 仍可能跳过新版本,原因往往藏在配置里:
-
"minimum-stability": "stable"会过滤掉RC、beta版本,哪怕它们已在 Packagist 公开 -
"prefer-stable": true会让 Composer 在满足约束前提下,优先选 stable 而非更新的 RC - PHP 版本约束写死在
composer.json(如"php": "8.1"),而新包要求^8.2,Composer 会直接排除该版本,连提示都不给 - 私有包若用了
replace或conflict,且未声明与新版本兼容,Composer 会在解析阶段静默跳过
真正卡住的从来不是缓存,而是 composer.json 里那几行看似无害的约束,和依赖树中某个包悄悄写的 conflict 声明。每次冲突复现,先跑 composer why-not vendor/package:2.1.0,比清十次缓存都管用。

















