Composer remove 默认安全删除目标包并自动清理未被其他包引用的依赖,不支持--with-dependencies;强制递归删除会破坏依赖契约,应通过composer show --unused分步确认移除。

remove 命令不支持 --with-dependencies
Composer 的 remove 命令根本没有 --with-dependencies 参数。这个选项只存在于 install 和 update 命令中,用于控制是否安装/更新依赖包的依赖项(即“传递依赖”)。试图在 remove 中使用它会直接报错:Unrecognized option "--with-dependencies"。
想递归删除一个包及其未被其他包需要的依赖,该怎么做?
Composer 默认的 remove 行为是「安全删除」:它只会卸载目标包,然后自动运行 composer update(隐式)来清理那些**不再被任何已保留包引用**的传递依赖。这本质上就是一种受控的“递归清理”,但不是强制删除所有曾被该包依赖过的包。
- 如果某个依赖(如
monolog/monolog)只被你刚删的包用,且没有其他包 require 它,它会被自动移除 - 如果另一个已安装的包(如
laravel/framework)也 requiremonolog/monolog,那它会被保留 - 执行
composer remove vendor/package-name后,Composer 会重写composer.lock并删vendor/下对应目录,整个过程是原子的
为什么不能强制“连根拔起”所有依赖?
因为这违背 Composer 的依赖解析原则:包的依赖关系由 composer.json 声明,而非安装历史。强行删除可能破坏其他包的运行时契约。
-
composer remove foo/bar不会删psr/log,哪怕foo/bar是唯一显式 require 它的包——因为psr/log是一个广泛使用的接口契约,很多包通过require-dev或间接方式依赖它 - 手动删
vendor/子目录或改composer.lock会导致下次install出错或行为不一致 - 真要清掉某类传递依赖,应先检查
composer show --tree vendor/package-name看依赖树,再逐个确认是否可删
composer show --tree monolog/monolog monolog/monolog 2.10.0 ├── php >=7.4.0 ├── psr/log ^1.0.1 || ^2.0 || ^3.0 └── symfony/phpunit-bridge ^5.4 || ^6.0
替代方案:模拟“彻底清理”的安全做法
如果你确实需要让项目回到“没装过某包及其全部关联依赖”的状态,推荐分步操作:
- 先运行
composer remove vendor/package-name,让 Composer 自动清理孤儿依赖 - 再执行
composer show --unused(需 Composer 2.5+),查看哪些包当前未被任何require或require-dev引用 - 对确认无用的包,单独
composer remove它们——不要批量删,避免误伤 - 若项目长期维护,建议定期运行
composer outdated和composer validate,比追求“完全干净”更实际
symfony/polyfill-* 或 doctrine/inflector)。它们往往不会因单个包的移除而消失,这是设计使然,不是 bug。










