Composer remove 未删干净 vendor 是正常设计行为,它仅更新 composer.json 和 composer.lock,不立即删除物理文件;需执行 composer install 或 update 才同步清理 vendor 并重建 autoload 映射。

composer remove 为什么没删干净 vendor 目录
执行 composer remove vendor/package 后,vendor/vendor/package 目录仍存在,不是 bug,是 Composer 的设计逻辑:它只负责更新 composer.json 和 composer.lock,物理删除由后续的安装命令触发。
常见错误现象:
- 手动删了
vendor/下某目录,但没改composer.json→ 下次composer install自动拉回来 - 只删了
composer.json里的行,没运行任何 Composer 命令 →vendor/完全不变,autoload 映射也还挂着 - 用了老版本 Composer(remove 不清理
vendor/,必须补composer install或composer update --with-dependencies
真正生效的链路是:remove → 更新声明和锁文件 → install/update 同步磁盘。验证是否成功:运行 ls vendor/vendor/package 应报 “No such file or directory”,且 composer show vendor/package 返回 “Package not found”。
怎么确认一个包真的“没被用”
不能光看自己有没有 use 或配置里有没有写它——Composer 的“未使用”定义很窄:该包既不在 composer.json 的 require 或 require-dev 中,也不被任何已安装包的 composer.json(含其 require-dev)声明为依赖。
实操分三步:
- 运行
composer show --installed列出所有已装包 - 对每个可疑包执行
composer why vendor/package;若返回Did not find package vendor/package in any registered root dependencies,说明它没被任何根依赖或其传递依赖引用 → 可删 - 注意
require-dev包在生产环境不加载,但只要它还在composer.json里,就不算“未使用”;要删得加--dev参数,比如composer remove --dev phpunit/phpunit
别跳过这步直接删:比如 guzzlehttp/guzzle 被 symfony/http-client 依赖,composer remove 会中止并告诉你谁在用——这不是失败,是保护机制。
删完包,Class not found 怎么办
composer remove 只管声明和 autoload 配置,不管你的代码里还留着多少 use、配置项、服务提供者注册或硬编码调用。这些残留才是上线后报错的根源。
必须人工扫:
- 全局搜索命名空间:比如删
monolog/monolog,就跑grep -r "use Monolog\" . --include="*.php"(注意反斜杠转义) - 检查
config/下配置文件(如logging.php)、app/Providers/里的服务提供者、事件监听器等是否还引用该包 - 运行
composer dump-autoload -o强制重建 autoload 映射;再检查vendor/composer/autoload_psr4.php是否还有对应命名空间条目
如果 autoload 文件里还有残留映射,说明 remove 没真正生效——可能是包名拼错、大小写不符,或被其他包间接 require 导致 Composer 拒绝移除。
缓存和 vendor 目录大小混淆问题
很多人想“清包”其实是想减小部署体积,结果去 composer clear-cache,发现 vendor/ 还是很大——这是正常现象。vendor/ 不是缓存,是已安装依赖的副本;clear-cache 只删 ~/.composer/cache,对 vendor/ 完全无影响。
如果目标是缩小部署包:
- 用
composer install --no-dev --optimize-autoloader,跳过开发依赖并生成高效 autoload map - 手动删
vendor/*/tests、vendor/*/docs等非运行必需目录(先确认许可证允许) - CI/CD 中建议每次构建后自动
composer clear-cache,避免缓存膨胀拖慢下载速度
缓存目录本身可安全清理,但要注意:正在运行的 composer install 进程不能中断,私有镜像源首次恢复时会重新下载,网络差的环境建议提前确认稳定性。











