必须同步删除vendor和composer.lock后重装,因校验失败根源是composer.lock中硬编码的dist.sha256与新镜像包哈希不匹配;仅清缓存、换镜像或单删vendor均无效,须确保源地址正确、系统时间准确且四者对齐。

恢复受损的 Composer 镜像源同步数据,核心不是“修”,而是“重建”——因为损坏通常表现为 hash verification failed、Package not found 或 Could not parse version constraint,本质是本地缓存、锁文件、vendor 目录三者与当前镜像源状态不一致。强行修复配置或清缓存无法解决元数据错配问题。
为什么 composer clear-cache 不够用
缓存只存 packages.json 快照和 provider 列表,不包含实际 ZIP 包内容或 composer.lock 中硬编码的 dist.sha256 和下载路径。即使你已切回官方源,只要 composer.lock 里还记着阿里云镜像返回的哈希值,composer install 就会校验失败。
-
composer clear-cache后仍报hash verification failed?说明问题在composer.lock,不是缓存 - 运行
composer install -vvv,日志中若出现Downloading https://mirrors.aliyun.com/composer/...,说明项目级repositories仍在生效,缓存清理无效 - 旧版 Composer(2.2–2.4)在清缓存后可能仍读取
~/.composer/cache/repo/下残留的空目录或损坏 JSON,需手动确认该目录为空
必须同步删除 vendor 和 composer.lock
这是唯一能打破校验锁死的操作。Composer 的 dist.sha256 校验是原子级的:它比对的是 composer.lock 记录的哈希与实际下载包的哈希。一旦两者来自不同镜像(比如 lock 文件生成于腾讯云,而你现在用阿里云),就必然失败。
- 执行:
rm -rf vendor composer.lock(Linux/macOS)或rd /s /q vendor & del composer.lock(Windows) - 不要只删
vendor:保留composer.lock会导致composer update复用旧路径,继续走错源 - 不要只删
composer.lock:composer update --lock会基于现有vendor重算依赖,可能引入不兼容版本,且仍沿用旧哈希上下文
验证是否真回到官方源再重装
重建前必须确认请求地址确实是 https://repo.packagist.org,否则新生成的 composer.lock 会立刻再次错配。
- 运行:
composer config repo.packagist(不加-g),输出应为{"type": "composer", "url": "https://packagist.org"}或报错Key "repo.packagist" does not exist - 检查环境变量:
env | grep COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows),非空则必须先清除 - 真实抓包验证:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "GET https",输出中必须含https://repo.packagist.org,不能是任何镜像域名
重装后别急着切回中文镜像
新生成的 composer.lock 和 vendor 全部基于官方源快照,此时若立刻执行 composer config -g repos.packagist https://mirrors.aliyun.com/composer/,后续 composer update 会因镜像同步延迟(通常 15–30 分钟)导致找不到刚锁住的包版本,再次触发 Package not found。
- 建议等待至少 10 分钟,再运行:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 注意字段名是
repo.packagist(单数),URL 必须带末尾/,且前缀必须是composer类型,即完整写成composer https://mirrors.aliyun.com/composer/ - 切回后仍要再跑一次
composer clear-cache,否则缓存里还存着官方源的快照,和新镜像不匹配
真正麻烦的不是命令输错,而是你以为删了某处配置就万事大吉——实际上 Composer 会从环境变量、项目 composer.json、全局 config.json、甚至缓存目录里拼出一个“最终源”,而你只改了其中一层。


















