应使用 composer remove 卸载包,它自动处理依赖声明、文件删除、锁文件更新和自动加载重建;手动删 vendor 或改 composer.json 易致 autoload 失败、锁文件不一致等问题。

直接用 composer remove,别手删 vendor/ 或硬改 composer.json
Composer 2.2+ 内置的 composer remove 就是专为安全卸载设计的——它不是“删文件”,而是执行一次反向安装:自动识别包在 require 还是 require-dev 里、删条目、删 vendor/vendor-name/package-name 目录、更新 composer.lock、重建 autoload 映射。整个过程原子化,中途失败会回退,不会留半截状态。
常见错误现象:
有人手动删掉 vendor/monolog/monolog,再删 composer.json 里那行,最后跑 composer install——结果 autoload 找不到类、composer show monolog/monolog 还显示已装(因 composer.lock 没同步更新),CI 构建也可能报哈希不一致。
-
composer remove monolog/monolog—— 自动判断位置,不用加--dev(除非同名包同时出现在require和require-dev) - 想跳过实时重装?加
--no-update:只改composer.json,后续统一composer update - 执行后立刻验证:
composer show monolog/monolog应报 “Package not found”,ls vendor/monolog应提示 “No such file or directory”
遇到 “required by another package” 别硬删,这是保护机制不是报错
比如你运行 composer remove guzzlehttp/guzzle,但 symfony/http-client 明确依赖它,Composer 会中止并告诉你谁在用——这不是命令失败,是你还没理清依赖链。
- 查谁在依赖它:
composer why guzzlehttp/guzzle,输出会列出所有直接引用者 - 若确实不需要上游包(如
symfony/http-client),可按提示确认降级或连带移除(Composer 会给出建议) - 临时调试想绕过检查?慎用
--no-update,之后composer update可能漏掉冲突,不推荐日常操作 - 绝对避免先删
composer.json条目再composer install,容易触发版本漂移,尤其锁文件有精确哈希时
删完还得人工扫代码,composer remove 不管 use、配置和注册
composer remove 只管声明和 autoload 配置,不管你的 PHP 文件里还留着多少 use MonologLogger、new Logger()、Laravel 的 config/logging.php 配置,或者 app/Providers/LoggingServiceProvider.php 里的注册逻辑。这些残留不清理,上线就 Class not found。
- 全局搜索关键词:
grep -r "use Monolog\" . --include="*.php"(注意反斜杠转义) - 检查
config/下配置文件、服务提供者、事件监听器是否硬编码调用了该包 - 运行
composer dump-autoload -o强制刷新映射,避免缓存误导判断 - 确认
composer.json的autoload.files或autoload.psr-4里没硬写该包路径
子依赖不会全清,要确认“孤儿”才真没人要
Composer 默认不删间接依赖。比如你删了 guzzlehttp/guzzle,它依赖的 psr/http-message 可能还在——因为 symfony/http-client 也在用它。只有当某个子依赖(如 guzzlehttp/promises)只被刚删的包引用,且没出现在其他包的 require 列表里,Composer 才会在 update 阶段顺手清掉。
- 想连带清理“只被该包引用”的子依赖?加
--with-dependencies:composer remove --with-dependencies guzzlehttp/guzzle - 真正确认“孤儿依赖”:
composer why psr/http-message,如果输出为空,才是真没人要 - 删完怀疑 vendor 还有残留?先
composer clear-cache,再composer install --no-cache重拉,比rm -rf vendor+composer install更稳妥
最麻烦的从来不是命令怎么敲,而是删完之后代码里还藏着三处 use、两行配置、一个服务提供者注册——这些 composer remove 绝对不会帮你擦屁股。











