vendor目录可删但不可不重建,它是依赖基座而非缓存;删后须用composer install重建并执行composer dump-autoload刷新自动加载映射,否则必报class not found错误。

vendor目录可以删,但删完不重建就跑不起来
技术上当然能删——rm -rf vendor 一敲就没了。但它不是缓存目录,而是项目运行的“依赖基座”:所有第三方类库、框架、工具都堆在这儿,vendor/autoload.php 是整个自动加载系统的入口。删了却不重建,Class not found 错误立马报给你看。
常见错误现象:PHP Fatal error: Uncaught Error: Class 'Illuminate\Support\Facades\DB' not found——这基本就是 vendor 消失或 autoload 映射没更新的典型信号。
- 适用场景:本地调试卡死、依赖冲突怀疑 lock 文件失效、CI 流程中强制干净重装
- 前提条件:必须保留
composer.json和composer.lock(尤其后者,它锁定的是精确版本) - 重建命令必须用
composer install,不是composer update;后者会重新解析依赖树,可能升版、引入不兼容变更
别手动删 vendor/xxx 子目录,用 composer remove
想卸载某个包?直接进 vendor/monolog/monolog 里 rm -rf 是最危险的操作之一。Composer 不知道你动过手,下次 composer install 可能覆盖、也可能留着残留,autoload 映射还挂着旧路径,结果就是类能找到但行为异常,或者测试通过线上炸锅。
正确做法只有一个:composer remove monolog/monolog。
- 它会自动:从
composer.json删条目、删vendor/monolog/monolog目录、更新composer.lock、重写vendor/composer/autoload_psr4.php等映射文件 - 如果该包被其他已安装依赖硬性 require,命令会报错并中止,这是保护机制,别绕过
- 开发依赖(
require-dev)也支持,无需额外参数;要连带删它的子依赖,加--with-dependencies
删完 vendor 还报错?可能是 autoload 缓存没刷新
执行了 composer install,vendor 目录也回来了,但还是 Class not found?大概率是 autoload 映射文件没生效,尤其在反复删装、切换 PHP 版本或容器环境时容易发生。
这不是 bug,是 Composer 的生成逻辑决定的:autoload 文件只在 install/update 时生成,中间手动改过 vendor 或 json,不会自动重刷。
- 先试
composer dump-autoload,它不碰依赖,只重写 autoload_*.php - 如果仍不行,且确认
composer.json和composer.lock一致,可删掉整个vendor/+composer.lock,再composer install——这是最干净的断点重启 - 注意:删
composer.lock后composer install实际等效于update,仅限你明确要重解依赖树时才这么做
生产环境删 vendor 是高危操作,除非你控制部署全流程
上线前清理磁盘空间?CI 中省时间跳过 install?这些念头在生产环境里基本等于埋雷。
因为 vendor 目录不只是代码堆,它还隐含了构建时的 PHP 版本、扩展状态、平台特性(如 ext-redis 是否启用)。本地 install 出来的 vendor,和线上环境未必兼容。
- 部署脚本若依赖 vendor 已存在(比如 rsync 同步而非完整重装),删了就中断流程
- 无
composer.lock的环境删 vendor 后install,可能拉到新版,触发未知 break change - 真正该做的:用
composer install --no-dev --optimize-autoloader压缩体积+提速,再配合composer-unused扫描未引用包,比硬删安全得多
复杂点从来不在“能不能删”,而在于删之后那一整条依赖链是否还在你掌控之中。










