composer remove 是当前最安全的卸载方式,它自动移除 composer.json 声明、更新 lock 文件并触发 vendor 清理(需后续 install/update),但不处理代码中 use/配置/字符串引用,也不删除间接依赖,残留问题须人工验证 autoload 和源码。

composer remove 是当前最安全的移除方式,但它不是“删完就完事”的黑盒操作——它只处理声明层和基础同步,不扫描代码、不清理间接依赖、也不校验运行时引用。直接执行 composer remove vendor/package-name 可能看似成功,但 vendor 目录残留、autoload 失效、或上线后 Class not found 报错,往往就出在这一步没闭环。
执行 composer remove 前必须确认三件事
命令失败或半途而废,多数是因为前提没对齐:
- 包名必须完全匹配
composer show输出的 name 字段(注意大小写、斜杠方向,比如monolog/monolog不能写成Monolog/Monolog) - 该包必须显式出现在
composer.json的require或require-dev中;如果只是被其他包带进来的(比如psr/log),remove会直接报Package ... is not required in your composer.json - 确认 Composer 版本 ≥ 2.2:运行
composer --version,若提示Command "remove" is not defined,先升级:composer self-update
composer remove 执行后 vendor 目录还在?这是正常现象
它默认不立即物理删除 vendor 子目录,而是标记为待卸载,靠后续 composer install 或 composer update 触发清理。常见误解是“命令没生效”,其实只是流程没走完:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer remove monolog/monolog后,立刻运行ls vendor/monolog,可能仍存在 —— 别慌,这不是 bug - 真正清空 vendor 需补一步:
composer install(推荐)或composer update --lock && composer install - 若跳过这步直接部署,
vendor/monolog会残留,且vendor/composer/autoload_classmap.php里可能还存着旧类路径,导致静默加载失败
为什么 composer remove 不自动删掉 psr/log 这类依赖?
Composer 的设计原则是“最小破坏”:它只移除你 显式声明 的包,不碰由其他已安装包共享的间接依赖。哪怕你删了 monolog/monolog,只要 symfony/console 还 require psr/log,它就会留在 vendor/ 和 composer.lock 中。
- 想确认某个包是否真没人用:
composer why psr/log,输出为空才代表可安全清理 - 若确认无引用,再执行
composer remove psr/log(注意:它可能在require-dev里,需加--dev) - 误用
--with-dependencies会强行删掉你在composer.json里手动写的子依赖(如guzzlehttp/promises),但若symfony/http-client也依赖它,删完就可能报错
删完之后最容易被忽略的三处硬编码残留
composer remove 完全不管 PHP 源码。这些地方不人工扫,上线必挂:
- 全局搜索所有
use语句:grep -r "use.*monolog" app/ src/ tests/,删掉整行 - 检查配置文件(
config/logging.php、app.php、services.php等),移除驱动注册、实例化、或配置键(如'default' => 'monolog') - 搜索字符串形式的类名:
grep -r "Monolog\\Logger|'monolog'" app/ src/,包括class_exists()、app()->make()、注解(如@throws Monolog\Logger)等隐式调用
composer.json)、文件层(vendor/)、映射层(autoload_*.php)到代码层(use / 配置 / 字符串类名)的逐级验证。尤其要注意 composer dump-autoload 必须手动补上,否则 autoload 映射不会更新——很多 Class not found 就卡在这一步。

















