答案是composer默认复用本地缓存的packages.json(15分钟内不过期),不发起远程请求,导致即使镜像站已更新新版本,update仍显示“nothing to install or update”;解决需用composer update --refresh(≥2.5)强制刷新元数据,或手动删除对应repo缓存子目录。

composer update 为什么死活不拉新 metadata
根本不是网络不通,而是 Composer 默认跳过远程请求——它只读 ~/.composer/cache/repo/https---mirrors-aliyun-com-composer/packages.json 这类本地快照,15 分钟内不过期,哪怕镜像站已同步 v3.6.0,它也当不存在。
典型现象:composer show monolog/monolog 显示 3.5.0,但 Packagist 页面明明写了 3.6.0;composer update monolog/monolog 却返回 Nothing to install or update。
- 检查是否真走镜像:运行
composer config -g repo.packagist.url,输出必须是https://mirrors.aliyun.com/composer/这类 HTTPS 地址,HTTP 会被静默拦截 - 确认没被项目级配置覆盖:执行
composer config --list | grep repositories,若repositories.packagist.url不是你设的镜像地址,说明composer.json里写了"repositories"字段,得删或重写 - 别信
composer clear-cache能解决元数据问题——它清的是 ZIP 包和 provider 缓存,不碰packages.json快照
composer update --refresh 到底干了啥
composer update --refresh(仅 Composer ≥ 2.5 支持)是专为元数据同步延迟设计的开关:它只删 cache/repo/ 下的 packages.json 和 provider-*.json,然后从当前生效镜像源重新下载最新索引,不重下 ZIP,也不动 vendor/ 或 composer.lock。
执行后立刻跑 composer update vendor/package,就能识别镜像站刚同步的新版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认版本:
composer --version输出至少是2.5.0,否则会报错Unrecognized option: --refresh - 确保镜像 URL 正确:如果
composer config -g repo.packagist.url输出是http://mirrors.aliyun.com/composer/,--refresh会去错地方拉,且大概率失败 - Windows 用户注意路径转义:删缓存目录时,
rm -rf要换成rd /s /q,路径用%APPDATA%\Composer\Cache\repo\https---mirrors-aliyun-com-composer
老版本 Composer(≤ 2.4)怎么手动刷新 metadata
没有 --refresh 参数,就得精准定位并删除对应镜像源的元数据缓存目录,否则 Composer 仍会复用旧快照。
命令本质是:找出缓存路径 → 删除该镜像专属的 repo/ 子目录 → 触发下次 update 重建索引。
- 获取真实缓存根目录:
composer config --global cache-dir(常见 Linux/macOS 是~/.composer/cache,Windows 是%APPDATA%\Composer\Cache) - 推导镜像缓存子路径:把镜像 URL 中的
https://、/、.全部替换成-,例如https://mirrors.huaweicloud.com/repository/php/→https---mirrors-huaweicloud-com-repository-php - 执行删除:
rm -rf $(composer config --global cache-dir)/repo/https---mirrors-huaweicloud-com-repository-php(Linux/macOS)或rd /s /q "%APPDATA%\Composer\Cache\repo\https---mirrors-huaweicloud-com-repository-php"(Windows) - 验证是否生效:跑
composer update --dry-run -v,看到Downloading https://...行才说明真去拉了
为什么删完缓存还是装不到新版
元数据刷新只是第一步。即使 packages.json 是新的,composer.lock 和 vendor/composer/installed.json 仍可能锁死旧版本,导致 composer install 完全不查远程。
尤其 CI/CD 流水线里,常因 composer.lock 没提交更新,导致部署始终用旧包。
-
composer.lock是安装事实依据:只要它存在且没变,composer install就严格按它装,哪怕composer.json已放宽版本约束 -
vendor/composer/installed.json记录当前已装包的精确版本,composer show直接读它,不触发远程查询 - 真正要“重来一遍”,推荐组合操作:
composer clear-cache+rm -rf vendor/composer/installed.json+rm -f composer.lock,再跑composer update - CI 场景下加兜底:脚本中检测
composer update失败后,自动 fallback 到官方源重试一次,避免卡死










