不会。composer remove 不识别 --no-dev 参数,该参数仅适用于 install/update;误用会导致报错或静默删错依赖;安全做法是显式使用 --dev 或不加参数来指定作用域。

composer remove 会误删 --no-dev 包吗?
不会。但很多人误以为 composer remove 默认只删生产依赖,其实它默认会检查整个 composer.json(含 require-dev),只要包同时出现在 require 和 require-dev 中,不加参数就可能删错位置。
真正安全的做法是显式指定作用域:
-
composer remove vendor/package:只从require删除(如果存在) -
composer remove --dev vendor/package:只从require-dev删除 -
composer remove --no-dev vendor/package:这个参数无效 ——--no-dev是install/update的开关,remove命令根本不识别它
为什么 composer remove --no-dev 会报错或静默失败?
因为 composer remove 命令本身没有 --no-dev 选项。Composer 会把它当作未知参数,要么直接报错 Unrecognized option "--no-dev",要么(在较老版本中)忽略该参数并继续执行 —— 此时行为退化为普通 remove,可能意外删掉 require-dev 里的同名包。
常见误操作场景:
- 刚运行完
composer install --no-dev,顺手敲composer remove --no-dev xxx,以为“延续上下文” - 把
composer update --no-dev的用法错误迁移到remove - CI 脚本里硬编码了
--no-dev,导致某次更新 Composer 后构建失败
想只删开发依赖,正确命令是什么?
必须用 --dev,不是 --no-dev:
composer remove --dev phpunit/phpunit
这条命令只会修改 require-dev 字段,不影响 require。如果该包只在 require-dev 中存在,它会被彻底移除;如果同时在 require 中存在,则保留生产依赖部分。
注意两个细节:
- 删除后自动触发
composer install(除非加--no-install) - 如果包被其他已安装包通过
require-dev间接依赖,remove仍会成功,但下次composer update可能重新拉进来 - 某些包(如
symfony/flex)有插件逻辑,删前建议先composer show vendor/package确认是否被启用
删包后 autoload 没更新?检查 vendor/autoload.php 是否重建
composer remove 会重写 autoload 配置并 dump 自动加载器,但如果你之前手动改过 composer.json 的 autoload 或 autoload-dev,或者用了 classmap + files 混合方式,删包后可能出现:
- PHP Fatal error: Class 'Some\Test\Class' not found
-
vendor/composer/autoload_classmap.php里还残留旧类路径
这时不要手动删文件,而是跑:
composer dump-autoload --optimize
或者更彻底地:
rm -rf vendor/autoload.php vendor/composer/autoload_*.php && composer install --no-dev
——尤其在 CI 环境中,缓存和增量安装容易让 autoload 状态滞后于 composer.json 的真实变更。










