根本原因是Composer复用本地缓存的packages.json和provider-*.json元数据(默认5分钟不过期),导致即使远端已发布新版本,update仍按过期快照判断“无更新”;需用composer update --refresh(≥2.5)强制重载,或手动清理~/.composer/cache/repo/下对应镜像子目录、vendor/composer/installed.json及composer.lock。

为什么 composer update 拉不到新版本?
根本原因不是镜像同步慢,而是 Composer 复用了本地缓存的 packages.json 和 provider-*.json 元数据——哪怕 Packagist 上已发布 monolog/monolog v3.0.0,你本地缓存里还只有 v2.12.0 的快照,composer update 就会“坚定”地认为没有可升级项。
这种缓存默认 300 秒(5 分钟)不过期,且按镜像 URL 隔离:切到阿里云镜像后,~/.composer/cache/repo/https---packagist.org/ 里的旧缓存不会自动失效,也不会被新镜像覆盖。
-
composer update默认只检查缓存 TTL,不校验远端 hash 变更 - 即使镜像站已同步新版,只要本地
provider-laravel.json的 hash 没变,就不会重拉 - 私有仓库或 Satis 场景下,若
packages.json未重新生成,Composer 会一直读旧内容
哪些缓存必须手动清理?
composer clear-cache 只清 ~/.composer/cache/files/(zip 包)和部分 repo 索引,但关键的元数据缓存(packages.json、provider-*.json)仍留在 ~/.composer/cache/repo/ 下对应子目录中,这才是导致解析结果不一致的主因。
真正要动的是这三处:
-
~/.composer/cache/repo/https---mirrors.aliyun.com-composer/(或你当前镜像的 URL 目录)下的所有provider-*.json文件 -
vendor/composer/installed.json:它固化了当前安装状态,影响composer show和依赖图推导 -
composer.lock:它不是缓存,但会锁死旧解析路径;想让update重新走 SAT 求解,就得删掉再跑
推荐组合操作:composer clear-cache && rm -rf ~/.composer/cache/repo/https---mirrors.aliyun.com-composer/provider-*.json && rm -f vendor/composer/installed.json && rm -f composer.lock
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
如何验证元数据是否真刷新了?
别信“我清过了”,要看日志里有没有实际下载动作。运行 composer update --dry-run -v,紧盯输出:
- 出现
Downloading https://mirrors.aliyun.com/composer/packages.json→ 成功触发重拉 - 出现
Writing /home/xxx/.composer/cache/repo/https---mirrors.aliyun.com-composer/packages.json into cache→ 新快照已落盘 - 只看到
Reading xxx from cache→ 缓存没清干净,或镜像源本身返回了 304 Not Modified
Windows 用户注意:del /q "%COMPOSER_HOME%\cache\repo\https---mirrors.aliyun.com-composer\provider-*.json" 要确保路径中反斜杠和通配符被 cmd 正确解析,建议用 PowerShell 替代。
项目级 repositories 配置会彻底绕过全局镜像
很多人在 composer.json 里写了 "repositories" 字段,却不知道它会直接屏蔽 composer config --global repo.packagist.url 的设置。一旦配置了自定义源,Composer 就不再查全局镜像,而是直连那个 URL —— 如果该 URL 已停更、权限错误或返回空 packages.json,依赖解析就会静默失败或降级到旧版本。
排查方法:
- 运行
composer config --list | grep repositories,确认repositories.packagist.url是你预期的镜像地址 - 检查项目
composer.json中"repositories"数组里的每个url是否可访问、是否返回有效 JSON - 临时注释掉
"repositories"字段,用composer update --dry-run -v对比行为变化
最隐蔽的问题往往不在缓存本身,而在你以为“用了镜像”,其实 Composer 根本没走那条路。

















