镜像同步延迟和元数据缓存未刷新是 Composer 无法找到新包的两大主因;国内镜像同步有时间差(阿里云10–30分钟,中科大/华为云约5分钟),且项目级 repositories 配置会覆盖全局镜像设置。

因为镜像不是实时转发,而是定时同步;元数据缓存未刷新 + 项目级 repositories 配置覆盖全局设置,是两大最常见原因。
镜像同步本身就有延迟,不是“配了就立刻生效”
国内主流镜像(阿里云、腾讯云)对 Packagist 的元数据同步有明确时间差:
- 阿里云:通常 10–30 分钟,高峰期可达 1–2 小时
- 中科大、华为云:同步更激进,多数情况控制在 5 分钟内
- 腾讯云默认 fallback 到
packagist.org,看似能装上,实则绕过镜像——网络差时反而失败
现象举例:spatie/laravel-ray 刚发布 v1.35.0,你在 Packagist 页面能看到,但 composer show spatie/laravel-ray 报 no matching package found,大概率就是镜像还没生成对应的 provider-spatie~laravel-ray.json 文件。
验证方式:curl -I https://mirrors.aliyun.com/composer/p/spatie/laravel-ray.json 返回 404 或 Last-Modified 时间早于发布时间,即确认未同步。
composer update 不刷新元数据,只读本地缓存
Composer 默认复用 ~/.composer/cache/repo/https---mirrors.aliyun.com-composer/packages.json(15 分钟内不过期),哪怕镜像站已更新,它也照旧用旧索引算依赖。
-
composer clear-cache只清files/下的 ZIP 包,不碰元数据缓存 -
composer update --refresh(≥ 2.5)才真正丢弃所有packages.json和provider-*.json,强制重拉 - 老版本(≤ 2.4)必须手动删缓存目录:
rm -rf ~/.composer/cache/repo/https---mirrors.aliyun.com-composer
注意路径中的 https---mirrors.aliyun.com-composer 是 URL 转义结果,必须和你当前 composer config -g repo.packagist 输出的地址严格一致;换中科大源就得删 https---mirrors.ustc.edu.cn-composer。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
项目级 repositories 配置会彻底屏蔽全局镜像
只要 composer.json 里存在 "repositories" 字段(哪怕为空或只写了个 {}),Composer 就自动忽略 composer config -g 设置的全局镜像,只按你写的 URL 去拉元数据。
- 常见陷阱:
"url": "https://packagist.phpcomposer.com"已停服,请求全404 - 漏写
"packagist.org": false,导致连monolog/monolog这类基础包都查不到 - 复制模板时没删掉私有源配置,结果所有请求都打到不可达地址
验证是否被覆盖:composer diagnose 看 “Repo packagist.org:” 行输出的 URL 是否为你预期的镜像地址;composer config repo.packagist 查当前项目是否设置了源。
中文搜索失效不是镜像问题,是 Packagist 机制限制
composer search 仅对 name 和 description 字段做英文前缀匹配,不支持中文分词、拼音或模糊联想。
- 搜
微信无效,搜wechat才可能命中 - 描述里写 “微信公众号 SDK”,
composer search 微信不触发匹配 - Gitee/GitHub 上未提交到 Packagist 的包,默认不在索引范围内
想查非 Packagist 项目,得手动加 vcs 类型仓库,并把 {"packagist.org": false} 放 repositories 第一项,否则 Composer 查到第一个就停,根本不会走后续源。
最易被忽略的一点:删完缓存目录后,不执行 composer update 或 composer show,缓存不会自动重建——它只在真实请求时才拉新。别删完就以为万事大吉。

















