composer install 卡在哈希校验失败是因为严格比对 composer.lock 的 dist/shasum 与 vendor 文件实际哈希值,不匹配则硬性中断;唯一合法跳过方式是 --force-reinstall,它强制重装而非跳过校验。

composer install 为什么卡在哈希校验失败?
因为 composer install 默认严格比对 composer.lock 中每个包的 dist/shasum 和本地 vendor/ 下实际文件的哈希值,只要一个不匹配(比如你手动改过某个包的文件、CI 复用了脏 vendor、或镜像源返回了篡改包),就会中断并报错:Hash mismatch for ...。这不是警告,是硬性拒绝继续。
跳过哈希检查的两种合法方式
真正能绕过校验的只有两个路径,且目的和风险完全不同:
-
composer install --dry-run --verbose:不是跳过,而是“只校验不安装”。它会逐个比对所有 dist 包的哈希,出错时直接报具体包名并退出,适合排查问题,但不会生成vendor/ -
composer install --ignore-platform-reqs:这个参数**完全无效**于哈希检查——它只跳过 PHP 版本/扩展等 platform 校验,对 shasum 无影响。别被名字误导。 - 唯一能跳过哈希校验的命令是:
composer install --force-reinstall。它不验证已有文件哈希,而是强制按composer.lock重新解压、覆盖、重写 autoload,等效于“就地重装”。前提是composer.lock本身合法且未被篡改。
什么时候必须删 vendor 而不是用 --force-reinstall?
当 composer.lock 已损坏(比如手动编辑过、content-hash 错误)、或 vendor/ 里混入了非 Composer 管理的文件(如自己加的 patch、IDE 自动生成的缓存)、或你怀疑本地缓存的 zip 包已损坏时,--force-reinstall 仍可能复用坏数据。
- 先运行
composer clear-cache清掉本地包缓存 - 再执行
rm -rf vendor(Windows 用Remove-Item -Recurse -Force vendor) - 最后严格用
composer install(不是update),确保完全从 lock 文件重建 - 注意:
composer update在这种场景下是危险操作,它会重新解析依赖树,可能升级到非预期版本
强制执行安装脚本(post-install-cmd)的可靠方法
post-install-cmd 不是每次 composer install 都触发——只有当 vendor/ 不存在或 composer.lock 发生变更导致实际安装行为发生时才运行。如果你只是想“补跑”脚本(比如漏了 storage:link 或 dump-autoload -o),不要重装依赖。
- 直接运行
composer run-script post-install-cmd,它会原样执行composer.json中定义的命令 - 如果脚本依赖某些环境变量或当前目录结构,确保你在项目根目录下执行
- 若脚本里有
php artisan类命令,确认 Laravel 的artisan可执行且权限正常,否则会静默失败










