关键动作是删除composer.lock,因其硬编码版本与校验值,导致update仅验证一致性而不拉新版本;必须同步清理composer.lock、~/.composer/cache/repo/https---packagist.org/和vendor/composer/installed.json,并按顺序执行。

直接删 composer.lock 才是关键动作。很多人反复运行 composer clear-cache 却发现 update 仍不拉新版本,问题不在缓存本身,而在锁文件硬编码了旧版本和校验值——Composer 认为“没变就不动”,根本不会去查远程有没有新版。
为什么 composer clear-cache 总是没用?
它只清 ~/.composer/cache/files/(ZIP 包)和 vcs/(Git 克隆),但完全跳过三处真正卡住更新的位置:
-
~/.composer/cache/repo/https---packagist.org/:存着过期的packages.json和provider-*.json,Composer 靠它决定“有哪些版本” -
vendor/composer/installed.json:记录当前已装包的精确版本,依赖解析时直接读它 -
composer.lock:锁定每个包的dist.sha256、source.reference和版本号,不删它,update就只是“验证一致”,不是“升级”
必须同步清理的三个位置(顺序不能错)
先清基础缓存避免干扰,再逐个击破元数据与状态残留:
- 运行
composer clear-cache - 删元数据快照:
rm -rf $(composer config --global cache-dir)/repo/https---packagist.org/(Windows PowerShell 用Remove-Item -Recurse -Force "$env:APPDATA\Composer\Cache\repo\https---packagist.org\") - 删本地安装快照:
rm -f vendor/composer/installed.json - 删锁文件:
rm -f composer.lock
验证是否真刷新了 metadata
别信命令执行完就 OK,要亲眼看到 Composer 重新拉远端索引:
- 运行
composer update --dry-run -v - 盯紧输出里有没有
Downloading https://packagist.org/packages.json - 如果只有
Reading /path/to/cache/packages.json,说明repo/没清干净,重走上面步骤 - 额外注意:
"minimum-stability": "stable"会过滤掉dev或beta版本,这不是缓存问题,是约束本身在生效
最易被忽略的是 composer.lock。删了缓存、删了 installed.json,却留着它,结果 update 依然原地不动——因为 Composer 的设计逻辑就是:锁文件存在且未变,就不触发版本变更。











