是,不加--dev可能删错地方:若包仅在require-dev中,会报“Could not find package”失败;若同名包同时存在于require和require-dev,则默认删require中的,导致运行时崩溃。

composer remove 不加 --dev 会删错地方吗?
会,但只在特定情况下。Composer 默认优先从 require 区域查找包;如果目标包只存在于 require-dev,不加 --dev 就会报 Could not find package "xxx"。它不会“静默删错”,而是直接失败——这是安全机制,不是 bug。
真正危险的是:同一个包名同时出现在 require 和 require-dev(比如某 SDK 自带 phpunit/phpunit,你又手动装了一个用于测试)。这时不加 --dev,Composer 可能删掉 require 里的那个,导致运行时崩掉。
- 绝大多数情况:包只在
require-dev→ 必须加--dev - 极少数情况:包在两个区域都存在 → 不加
--dev有误删风险,必须显式指定 -
--no-dev对remove命令完全无效,会报错或被忽略,别用
为什么不能靠 composer show 或 composer.json 猜着删?
composer show 显示的是已安装包,但它不告诉你这个包是从 require 还是 require-dev 装的——除非你加 -i(composer show -i vendor/package)看安装来源,或者直接打开 composer.json 查。
但手动编辑 composer.json 后跑 composer install 是高危操作:autoload 映射可能残留、post-install 脚本不会触发、replace/conflict 关系不会被校验。而 composer remove --dev xxx 是原子化流程:删声明 → 卸载文件 → 刷新 autoload → 触发 uninstall 脚本(如有)→ 回滚失败操作。
- 想确认包在哪:运行
composer show -i vendor/package,看输出里写的是require还是require-dev - 别手改 JSON + install:容易留下
vendor/composer/autoload_*.php旧映射,类还能加载但版本错乱 - 带 uninstall 脚本的包(如 Laravel 扩展)只有
remove会执行它
删完 --dev 包后,代码里还有引用怎么办?
composer remove --dev 只动 composer.json 和 vendor/,完全不管你的源码。这是最常被忽略的一环。
典型残留点包括:use 语句、配置文件注册(如 config/app.php 中的 providers)、测试文件调用、IDE 缓存、甚至 .env 里的开关。这些不会报错直到运行时,而且错误信息往往不指向根源。
- 先全局搜
grep -r "PHPUnit\|phpunit" . --include="*.php"(按实际类名调整) - 重点检查
config/下所有 PHP 文件,尤其是app.php、services.php - 删完立刻跑
composer dump-autoload -o,再清框架缓存(如php artisan config:clear) - IDE 提示“class not found”但运行不报错?大概率是旧 autoload 映射没清干净
遇到 “package is required by another package” 怎么办?
这不是错误,是 Composer 在保护你。说明你想删的包被其他已装包依赖(比如删 phpunit/phpunit,但 orchestra/testbench 显式 require 它)。
此时 Composer 会暂停并提示可选动作:降级依赖方、连带移除上游包、或中止。强行跳过会导致依赖断裂,后续 composer update 可能失败或装错版本。
- 接受 Composer 的自动处理建议(通常最稳妥)
- 若确定要硬删,加
--no-update:仅删composer.json条目,不卸载文件也不更新 lock —— 之后需手动composer update调整 - 别用
--force或--ignore-platform-reqs:它们对remove无效,且掩盖真实约束问题


















