hash verification failed 根因是 composer.lock 中哈希与镜像源实际 dist 包元数据不一致;须先禁用镜像(composer config -g --unset repos.packagist && composer config -g repo.packagist composer https://packagist.org),再同步删除 vendor 和 composer.lock、清缓存(composer clear-cache),最后用 --no-cache --force-checksums 强制重装。

hash verification failed 不是包被篡改,也不是你代码写错了,而是 Composer 在比对本地 composer.lock 里硬编码的哈希值和它从镜像源实际下载下来的包内容时,发现对不上——三者(lock 文件、缓存 zip、镜像元数据)只要有一处没对齐,它就拒绝安装。
删 vendor 和 composer.lock 之前先禁用镜像
不关镜像就删,重装时还是会去拉那个同步滞后的镜像,错误照旧。 必须执行:
-
composer config -g --unset repos.packagist(清全局镜像配置) -
composer config -g repo.packagist composer https://packagist.org(切回官方源)
验证是否生效:composer config -g repo.packagist 输出应为完整 JSON,含 "url": "https://packagist.org"。如果还是显示阿里云地址,说明项目级 composer.json 的 repositories 段覆盖了全局配置,得临时删掉或改掉。
强制重装必须带 --no-cache 和 --force-checksums
只删 vendor/ 和 composer.lock 不够,因为 composer install 默认优先从本地缓存(~/.composer/cache/files/)解压旧 zip,根本不会发网络请求。
真正触发全新下载的组合是:
-
rm -rf vendor composer.lock(Windows 用rd /s /q vendor & del composer.lock) -
composer clear-cache(清掉可能损坏的缓存 zip) -
composer install --no-cache --force-checksums(跳过缓存 + 强制校验新下载内容)
--force-checksums是关键:它让 Composer 不信任任何已有文件,哪怕缓存里有同名 zip,也强制重新下载并按 lock 文件里的哈希值校验。
离线环境也要设 COMPOSER_DISABLE_NETWORK=1
即使 vendor/ 和 composer.lock 都齐全,离线运行 composer install 仍可能卡住——因为它默认要联网确认包是否存在、URL 是否可访问。
此时所有 --no-xxx 参数都无效,必须:
- 加环境变量:
COMPOSER_DISABLE_NETWORK=1 - 同时加参数:
--no-plugins --no-scripts --no-autoloader(防插件隐式联网) - 补一记:
composer dump-autoload -o(否则运行时报Class not found)
别漏 COMPOSER_DISABLE_NETWORK=1,这是离线校验成功的前提,不是可选项。
校验失败最常被忽略的点是:你以为在“重装”,其实 Composer 还在复用缓存;你以为切了镜像,其实项目配置把它盖掉了;你以为断网能跳过校验,结果它还在默默连远程——每一步都要验证是否真生效,而不是只看命令有没有跑完。











