composer remove 会删除 composer.json 中的依赖项、卸载源码、清理 vendor 目录、更新 composer.lock 并执行 dump-autoload,但不处理 use 语句、配置文件、数据库迁移、缓存键、service provider 注册及环境变量等残留。

composer remove 会删掉哪些东西
执行 composer remove vendor/package-name 不只是从 composer.json 里删掉那行,它还会:自动卸载对应包的源码、清理 vendor/ 下的目录、更新 composer.lock、并重新 dump-autoload(如果启用了自动加载)。
但注意:它不会动你代码里手动写的 use 语句、不会删配置文件、也不会清理数据库迁移或缓存键这类运行时残留——这些得你自己扫。
- 如果你用的是 Laravel,某些包可能注册了 Service Provider 或 Facade,
remove不会帮你从config/app.php里删掉它们 - 有些包带 post-remove 脚本(比如清缓存、删配置),但极少有包真正实现,别默认依赖这个
- 如果包被其他已安装包 require,
composer remove会失败并报错:Package vendor/package-name is required by ...
卸载插件前先确认是否还在被引用
很多“多余插件”其实还被项目某处悄悄调用着,比如在某个命令类里 new SomeThirdPartyClient(),或者 config 文件里写了 'driver' => 'some-package-driver'。直接删容易跑出 Class not found 或 Driver not supported 错误。
建议按顺序检查:
- 全局搜索
vendor/package-name和包名关键词(比如guzzlehttp、spatie/laravel-backup)——注意大小写和命名空间缩写 - 看
composer show vendor/package-name输出的requires和required-by字段,确认有没有隐式依赖 - 如果包提供 Artisan 命令,运行
php artisan list | grep package看是否还注册着
移除后 autoload 没刷新?试试手动 dump
极少数情况下,composer remove 执行成功但类仍能 new 出来,或者报 Class not found 却查不到哪里引用——大概率是 autoloader 缓存没及时更新,尤其在 Docker 或某些 CI 环境里。
这时候别猜,直接补一句:
composer dump-autoload
如果用了优化模式(--optimize 或 --classmap-authoritative),记得加参数重生成:
composer dump-autoload --classmap-authoritative
-
vendor/autoload.php是入口,但它背后依赖vendor/composer/autoload_classmap.php等文件,删包不等于这些文件立刻重写 - Laravel 9+ 默认开启
classmap-authoritative,删包后不dump就会卡在旧映射里 - 开发时可以加
-vvv参数看remove过程中是否真执行了 autoload 更新步骤
想彻底清理残留配置和迁移?得手动来
Composer 只管 PHP 依赖的生命周期,不管业务侧的绑定关系。比如你删了 laravel/scout,但 config/scout.php 还在、模型里还有 Searchable trait、数据库里还有 scout_metadata 表——这些都得人肉处理。
- 删包后搜一遍
config/目录下对应配置文件,比如config/algolia.php、config/sentry.php - 检查
database/migrations/是否有该包生成的迁移,别留空表或失效索引 - 某些包会在
app/Providers/里建专属 ServiceProvider,删包后记得顺手删掉对应文件和config/app.php中的注册项
最麻烦的其实是环境变量:像 ALGOLIA_APP_ID 这种,删了包但 .env 里还留着,既占地方又容易误导后续接手的人。










