composer remove --dev 是 Composer 7.0+ 引入的专用命令,用于安全移除 require-dev 中的开发依赖,自动更新 composer.json 并清理 vendor;不加 --dev 则仅操作 require,对 require-dev 中的包会报错。

composer remove --dev 是 Composer 7.0+ 引入的命令,用于安全移除开发依赖(require-dev 中的包),它会自动从 composer.json 删除条目,并卸载对应文件,比手动编辑 + composer install 更可靠。
为什么不能直接用 composer remove 不加 --dev
默认 composer remove 只操作 require(生产依赖)。如果目标包只在 require-dev 里,不加 --dev 会报错:
Package "xxx" is not required in your composer.json and has not been removed.
这不是权限或缓存问题,是命令作用域限制 —— 它根本不会去查 require-dev 区域。
正确移除开发依赖的完整步骤
执行前确保已提交当前 composer.json,避免误删后无法回溯。
- 运行
composer remove --dev,例如:composer remove --dev phpunit/phpunit - 命令会自动:删除
composer.json中require-dev对应项、运行composer install --no-dev(即跳过 dev 包重装)、清理vendor/中该包及其未被其他依赖引用的子依赖 - 检查
composer.json确认require-dev已更新;运行composer show --dev验证是否不再列出该包 - 如需同时移除多个包,可一次写多个名字:
composer remove --dev friendsofphp/php-cs-fixer squizlabs/php_codesniffer
常见误操作和坑
这些情况会导致命令失败或行为不符合预期:
-
composer remove --dev在 Composer 6.x 或更早版本中不存在,会提示Command "remove" is not defined;必须升级到 7.0+:composer self-update - 包被其他
require-dev依赖间接引用时,它可能不会被完全卸载(Composer 会保留其作为子依赖),但主条目一定会从require-dev中清除 - 如果包同时出现在
require和require-dev中(极少见),--dev仅移除require-dev条目,不影响生产环境使用 - 执行后
vendor/中残留文件?大概率是该包被其他 dev 依赖 require,或本地有硬链接/符号链接未被清理 —— 此时应运行composer dump-autoload并确认composer show --dev输出
最易忽略的是版本兼容性:很多团队还在用 Composer 2.x(LTS)或 6.x,--dev 参数根本不可用。别猜,先 composer --version 看清楚再动手。










