不能乱删的临时文件是~/.composer/cache/files/下的ZIP包(如symfony/console-12345678.zip)和项目根目录的vendor/、composer.lock;误删ZIP会导致“Corrupted zip file”错误,因composer.lock硬编码其SHA256哈希值,不匹配即失败。

删错临时文件后直接跑 composer install 通常无效,必须同步清理 vendor/ 和 composer.lock,再用带校验参数的命令重装。
哪些临时文件不能乱删?
Composer 的“临时文件”不是指缓存目录里的任意东西——真正影响安装流程的是 ~/.composer/cache/files/ 下的 ZIP 包(如 symfony/console-12345678.zip)和当前项目下的 vendor/、composer.lock。误删单个 ZIP 文件会导致 “Corrupted zip file” 错误;误删整个 cache/files/ 目录反而可能绕过问题,但若 composer.lock 里仍存着旧哈希值,Composer 会拒绝继续。
- 只删 ZIP:必须同步删掉对应的
composer.lock条目或整个composer.lock - 删了
vendor/但留着composer.lock:运行composer install会尝试还原,但若 ZIP 已坏,仍报错 - 删了
cache/files/却没清composer.lock:Composer 会尝试重建 ZIP,失败后卡住
删错后怎么快速恢复?
核心是切断损坏 ZIP 与锁文件的绑定关系,并强制 Composer 忽略缓存、重新校验。不要依赖 composer clear-cache,它不解决锁文件指向坏哈希的问题。
- 确认当前目录下有
composer.json,且内容完整 - 执行
rm -rf vendor composer.lock(Linux/macOS)或rd /s /q vendor & del composer.lock(Windows) - 运行
composer install --no-cache --force-checksums:前者跳过本地 ZIP 复用,后者让校验失败立刻中断,避免静默污染vendor/ - 若仍失败,检查是否残留环境变量:
env | grep COMPOSER_REPO(Linux/macOS),有输出需先unset
为什么不能只删 ZIP + composer install?
composer.lock 里硬编码了每个包的 dist.sha256 值。你删了 ZIP,但 lock 文件还指着那个哈希,Composer 就认定“该文件本应存在”,于是反复尝试读取、解压、失败,不会自动换源或跳过。它不关心 ZIP 是否真在磁盘上,只认哈希匹配。
- 删 ZIP 后单独跑
composer install→ 报错不变,因为 lock 没变 - 删 ZIP 后跑
composer update→ 更危险,会改写 lock,引入非预期版本 - 删 ZIP 后跑
composer install --no-cache→ 仍会查 lock 里的哈希,找不到匹配 ZIP 就终止
最易被忽略的一点:恢复操作前没验证 composer.json 是否被意外修改过。哪怕只多了一个逗号,composer install 在无 lock 时会直接报 JSON 解析错误,而不是告诉你哪错了。











