composer中文镜像非实时同步,provider-*.json按需拉取;元数据请求不走repositories列表,须用composer config --global repo.packagist composer配置全局镜像源,url末尾必须带/,且项目级repositories存在时会屏蔽全局配置。

Composer中文镜像不是“实时同步的副本”,它根本不会主动拉取全量数据;你看到的“装不上新版本”,大概率是镜像还没收到那个 provider 文件的首次请求,而不是配置错了。
镜像元数据请求根本不走 repositories 列表
你在 composer.json 里写 "repositories": [{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}],对官方包(比如 laravel/framework)完全无效。Composer 2.2+ 把 Packagist 元数据源(packages.json、所有 provider-*.json)硬编码为全局单例,只认 repo.packagist 这个配置项。
-
composer config --global repo.packagist composer https://mirrors.aliyun.com/composer/才是唯一生效方式 -
repo.packagist必须是单数、小写、无s;写成repos.packagist会静默忽略 - URL 必须以
/结尾,否则拼出的路径如/composerpackages.json直接 404 - 项目级
repositories字段一旦存在(哪怕空数组[]),全局repo.packagist就彻底失效
provider-*.json 是按需同步,不是定时刷新
镜像站不轮询 Packagist,而是等你第一次请求某个 p2/vendor/package/1.2.3.json 时,才反向拉取并缓存。这意味着:
- 刚发布的 tag 可能要等 5–30 分钟才在镜像里出现
-
curl -I https://mirrors.aliyun.com/composer/p2/laravel/framework/10.0.0.json返回 404 ≠ 配置失败,只是还没被触发同步 - 对比官方源同路径返回 200,就能确认是镜像滞后而非网络问题
- 中科大镜像通常比阿里云快 3–8 分钟,可临时切换:
composer config -g repo.packagist composer https://mirrors.ustc.edu.cn/composer/
为什么 composer install 有时还是走 packagist.org?
这不是 fallback 失效,而是 Composer 2.2+ 的兜底设计:镜像返回 404 或 503 时自动切回官方源。这是正常行为,不是 bug。
- 日志里看到
GET https://api.packagist.org/,先别慌——检查镜像页底部“最后更新时间”是否滞后超过 30 分钟 -
composer require monolog/monolog --no-install -vvv能看清真实请求链:先镜像 → 404 → 官方 - 删
vendor/和composer.lock再重装,避免旧 lock 文件里的 hash 与镜像元数据不匹配 -
packagist.org: false不能乱加,否则连基础包都拉不到,直接报错
真正卡住的从来不是命令行或配置,而是某个 provider-laravel~10.0.json 文件在镜像里还不存在——它得等第一个人去“敲门”,才会从官方源拉进来。这个机制没法绕过,只能验证、等待或换镜像。











