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 还在复用缓存;你以为切了镜像,其实项目配置把它盖掉了;你以为断网能跳过校验,结果它还在默默连远程——每一步都要验证是否真生效,而不是只看命令有没有跑完。