删 vendor 后应运行 composer install 恢复,因它严格按 composer.lock 精准重建依赖;composer update 会重算依赖树导致版本漂移,composer require 只装新包不修复缺失,且不存在 composer reinstall 命令。

删了 vendor 目录后,直接运行 composer install 就能完整重建,前提是 composer.json 和 composer.lock 都完好。
为什么不能用 composer update 或 composer require?
这两个命令的设计目标不是“恢复”,而是“变更”:
-
composer update会忽略composer.lock,重新解析依赖树,升级包版本,改写 lock 文件——你丢掉的是环境确定性 -
composer require xxx只装新包,不检查旧依赖是否完整,vendor 很可能只剩一半 - 手动执行
composer reinstall?这个命令根本不存在,会报错Command "reinstall" is not defined
执行 composer install 前必须确认的三件事
它看起来简单,但失败往往卡在这三个地方:
-
composer.json必须存在且语法正确:用composer validate检查,常见错误是末尾多逗号、字段名拼错(如"requries") -
composer.lock必须存在且未被污染:Git 协作中换行符混乱(CRLF/LF)、手动编辑过、或被部分覆盖都可能导致校验失败 -
vendor/目录必须完全为空:哪怕残留一个空子目录(如vendor/autoload),Composer 就会走“增量更新”逻辑,不会补全缺失包
Windows 下 composer install 卡住或 Permission denied 怎么办?
这不是网络问题,而是文件系统锁或权限残留:
- 先关掉所有 IDE、编辑器、终端里正在访问 vendor 的进程(特别是 PHPStorm、VS Code 的文件监视)
- 用资源管理器或
rm -rf vendor(WSL)彻底删除,别只删内容留空夹 - 若仍报
Permission denied,说明某些 .dll 或 .exe 被 Windows 锁住,可尝试在管理员 PowerShell 中运行:takeown /f vendor /r /d y && icacls vendor /grant %USERDOMAIN%\%USERNAME%:F /t - 避免在 Git Bash 里混合使用
rm -rf和 Windows 资源管理器删除——路径处理不一致易留隐藏句柄
离线服务器上 vendor 损坏了,还能重建吗?
不能在离线机上跑 composer install,它默认要连 packagist.org 获取元数据和 dist 包。
- 正确做法是在有网、PHP 版本/扩展/OS 架构一致的机器上,执行:
composer install --no-dev --prefer-dist --no-interaction --no-plugins --no-scripts - 然后把整个
vendor/打包(tar -czf vendor.tgz vendor),传到离线机解压覆盖 - 离线机上不要运行任何
composer update、dump-autoload以外的命令;如果需要优化自动加载,再跑一次composer dump-autoload --optimize - 缓存(
~/.composer/cache)对离线部署无意义,别传,也别指望它能起作用
最容易被忽略的一点:缓存损坏比 vendor 损坏更难排查。即使你删了 vendor、重跑了 install,如果 ~/.composer/cache 里存着一个哈希校验失败的 zip,它还是会解包失败。遇到 Failed to extract 类错误,第一反应应该是 composer clear-cache,而不是反复删 vendor。


















