删掉 vendor 目录后,必须用 composer install 恢复,因它严格按 composer.lock 中锁定的精确版本、哈希、路径和源地址还原,确保与原环境完全一致;而 composer update 会忽略 lock 文件、重解析依赖并升级版本,导致环境不一致、ci 失败或运行时错误。

删掉 vendor 目录后,直接运行 composer install 就能全量恢复,前提是 composer.lock 文件完好 —— 这是唯一能保证和原来一模一样的方式。
为什么必须用 composer install 而不是 composer update
因为 composer.lock 里锁死了每个包的精确版本、哈希值、安装路径和源地址。composer install 只读 lock 文件,不查网络最新版,也不升级任何东西;而 composer.update 会彻底忽略 lock,重新解析 composer.json 的版本约束,结果可能装上新 minor 版本甚至不兼容的 patch,CI 和线上环境就容易出问题。
- 现象:
composer update后vendor/laravel/framework变成 v11.12.0,但之前是 v11.11.3,且composer.lock的content-hash已变 - 风险:PHP 扩展要求变更、子依赖版本漂移、
autoload映射错乱 - 中文环境下更易踩坑:镜像源配置错误或过期(比如还指向已停用的 phpcomposer.com),
update会卡在元数据请求阶段,看起来像“没反应”
删 vendor 后 composer install 失败的三大高频原因
不是命令错了,而是状态不干净。中文 Windows 用户尤其常卡在这三处:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/没真正清空:资源管理器删到一半报“权限拒绝”,留下空目录或vendor/autoload.php—— Composer 会误判为“已存在”,跳过完整安装,只做增量更新,缺失包不会补 - Composer 缓存损坏:
~/.composer/cache里存着解压失败的 zip 包,重装时反复失败,报错如Failed to extract vendor/monolog/monolog -
composer.lock被 Git 拉取时换行符污染(CRLF/LF 混用),或手动编辑过,composer install直接报lock file is not up to date
Windows 中文系统下安全清场 + 全量恢复实操步骤
别用资源管理器删 vendor,也别在 Git Bash 里混用 rm -rf 和图形界面删除 —— 句柄残留和路径处理不一致极易导致后续失败。
- 先关掉所有 IDE(PHPStorm/VS Code)、终端中正在 watch vendor 的进程
- 以管理员身份打开 PowerShell,执行:
takeown /f vendor /r /d y && icacls vendor /grant %USERDOMAIN%\%USERNAME%:F /t<br>rd /s /q vendor<br>composer clear-cache
- 确认
composer.lock没被修改:git status composer.lock应显示 “nothing to commit”;若已改,用git checkout HEAD -- composer.lock回滚 - 最后执行:
composer install(别加--no-dev,除非你确定项目部署时就是这么装的)
恢复完仍报 Class not found 或自动加载失效
这说明 vendor 虽然装回来了,但 PHP 还在用旧的 autoloader 缓存。尤其 Laravel、Symfony 项目常见。
- 先运行:
composer dump-autoload --optimize(Laravel 项目建议加--classmap-authoritative) - Web 环境下必须清 OPcache:
opcache_reset()或重启 PHP-FPM/Apache/Nginx - 别忽略
vendor/composer/autoload_static.php这类生成文件 —— 它是 dump-autoload 的产物,手动删了也没用,必须重跑命令
最麻烦的情况不是 vendor 删了,而是 composer.lock 本身已经“脏”了:Git 提交时换行符混乱、多人协作中有人手改过、或者用了不同大版本的 Composer(1.x vs 2.x)生成过 lock。这种状态下重装出来的 vendor 表面能跑,但某天 CI 就会突然失败 —— 因为 lock 文件的校验逻辑在不同 Composer 版本间有细微差异。










