直接结论是composer在当前源中未查到目标版本元数据,主因是镜像同步延迟、provider缓存过期、stability约束拦截或repositories配置覆盖;需用curl比对p2接口版本、手动删除对应repo缓存目录、确认repos.packagist复数配置及显式启用packagist.org。

直接结论:不是包没了,也不是你手抖输错,而是 Composer 在当前源里压根没查到那个版本的元数据——原因集中在镜像同步延迟、provider 缓存过期、stability 约束拦截、或 repositories 配置覆盖这四点。
curl 验证镜像是否真同步了你要的版本
别信 Packagist 页面显示“v3.6.0”,也别猜镜像“应该同步了”。Composer 查的是 p2/ 接口返回的 JSON,不是网页。必须用 curl 直接比对:
- 查官方源最新 tag:
curl -s https://packagist.org/p2/monolog/monolog.json | jq -r '.packages."monolog/monolog" | keys[]' | sort | tail -3 - 查你用的镜像(如阿里云):
curl -s https://mirrors.aliyun.com/composer/p2/monolog/monolog.json | jq -r '.packages."monolog/monolog" | keys[]' | sort | tail -3 - 如果镜像输出里没有你要的
3.6.0,就是同步延迟;若返回 404 或空 JSON,说明镜像还没拉到这个包的 provider 数据 - 顺手检查镜像本身是否可用:
curl -I https://mirrors.aliyun.com/composer/packages.json—— 必须是HTTP/2 200,不是301或证书错误
删 provider 缓存,不是 composer clear-cache
composer clear-cache 只清 ZIP 和部分 dist 缓存,对 provider-*.json 文件完全无效。真正卡住你的,是本地缓存的旧索引结构。必须手动删:
- 先确认镜像路径:
ls -d ~/.composer/cache/repo/https---mirrors.aliyun.com-composer(URL 中/被转义为---) - 删掉它:
rm -rf ~/.composer/cache/repo/https---mirrors.aliyun.com-composer - Windows 用户路径类似:
%APPDATA%\Composer\cache\repo\https---mirrors.aliyun.com-composer - Composer ≥ 2.5 可用更准的命令:
composer update --refresh,它只刷新 provider 元数据,不碰 vendor
检查 repositories 是否静默屏蔽了全局镜像
只要项目 composer.json 里有 "repositories" 字段,无论内容是否为空、哪怕只加了一条私有 Git 地址,Composer 就会彻底忽略 repo.packagist 全局配置,只查你列出来的地址。
- 运行
composer config repositories(不加-g),看输出是否包含你配的源,且不含https://repo.packagist.org - 若你只想加私有源又保留 Packagist,必须显式写全:
{"packagist.org": false}放第一项,再加一条{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 漏掉
{"packagist.org": false},Composer 仍会 fallback 到默认源,但顺序混乱可能导致同名包被错误匹配 - 检查键名:Composer ≥ 2.2 要求写
repos.packagist(复数),repo.packagist会静默失效
确认 stability 约束是否拦住了 dev-main 或 beta 版本
dev-main 不是版本号,是分支标识符。默认 "minimum-stability": "stable" 会直接过滤掉所有非 stable 的候选版本,连解析都不做。
- 运行
composer show -a vendor/name,如果输出里没有dev-main,不是它不存在,而是被稳定性策略跳过了 - 临时装一个 dev 分支:
composer require vendor/name:dev-main@dev(@dev后缀是关键) - 或放宽本次请求:
composer require vendor/name:dev-main --stability=dev - 别改
minimum-stability到dev长期存在——它会让所有依赖都降级找 dev 版,极易引发冲突 - 注意:
branch-alias在 Composer 2.0+ 已被移除,extra.branch-alias写了也白写
最常被忽略的其实是缓存路径的 URL 转义规则和 repos.packagist 的复数形式——这两个点一错,其他操作全白忙。











