composer remove --dev是唯一安全移除require-dev包的方式,不加该参数可能误删生产依赖或报“could not find package”错误;--no-dev对remove命令无效,会报错或被忽略。

composer remove --dev 是唯一安全删 require-dev 包的方式,不加 --dev 可能误删生产依赖,加错参数(比如 --no-dev)会直接报错或静默失效。
为什么必须用 --dev 而不是默认行为
Composer 默认只查 require 区域。如果目标包(如 phpunit/phpunit)只在 require-dev 里,不加 --dev 就会报 Could not find package "phpunit/phpunit" ——它不是卡住,是主动拒绝执行,防止你误操作。
真正危险的是同名包同时存在于 require 和 require-dev(例如某 SDK 自带 symfony/console,你又手动装了一个用于本地调试)。这时不加 --dev,composer remove symfony/console 会删掉 require 里的那个,运行时立刻崩。
-
--no-dev对remove命令完全无效:Composer 会报Unrecognized option "--no-dev"或直接忽略它,退化为无参行为 - 别指望“自动识别”:虽然某些版本在包仅存于
require-dev时能猜中,但一旦有歧义,就靠不住 - 想确认包在哪?运行
composer show -i vendor/package,看输出里写的是require还是require-dev
composer remove --dev 实际执行了什么
它不是简单删 JSON 行,而是一套原子化流程:删 composer.json 中 require-dev 条目 → 卸载 vendor/ 下对应目录 → 清理未被其他依赖引用的子依赖 → 刷新 vendor/composer/autoload_*.php → 触发该包注册的 uninstall 脚本(如有,比如 Laravel 扩展)→ 更新 composer.lock。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不会动你的源码:
use、new、配置文件(如phpunit.xml)、CI 脚本里的调用都得你手动清理 - 如果包被其他
require-dev依赖间接引用(比如behat/behat依赖phpunit/phpunit),主条目一定从require-dev清除,但代码文件可能因被共用而残留 - 删完立刻运行
composer dump-autoload,尤其用了--classmap-authoritative的项目,否则旧类映射还在,报错却不提示来源
批量删多个 dev 包的实操限制
composer remove --dev a/b c/d e/f 是合法的,shell 层面一次传多个包名,Composer 内部仍逐个处理 —— 它不是“并发删”,而是顺序执行、每个包都走完整卸载流程。
- 不支持分包指定作用域:所有包都按
--dev处理,不能对其中某个加--dev、另一个不加 - 如果某包只在
require里,却混在--dev批量命令里,它会被跳过,不报错也不警告(Composer 7.0+ 行为) - 更稳妥的批量方式:写个 shell 循环,或用
jq清空整个require-dev段后跑composer update --no-dev,但后者会重装所有剩余 dev 包,有版本漂移风险
删完还出问题?这些地方最容易漏
最常被忽略的是 composer.json 里和 autoload 相关的残留字段:
-
autoload-dev字段里还挂着"psr-4": {"Tests\": "tests/"}?删了phpunit/phpunit后这个映射通常已无用,但不删它,composer dump-autoload仍会扫描tests/目录,拖慢加载速度甚至引入冲突 -
scripts里还有"test": "phpunit"?命令行直接报Command "phpunit" not found,但错误信息不指向 composer.json -
config或第三方配置(如phpstan.neon)里硬写了已删包的路径或扩展?这类问题不会在composer remove阶段暴露,要等 CI 或本地跑测试才炸
删 require-dev 不等于清空开发环境,只是移除了声明层依赖;实际影响取决于你代码里怎么用它、配置里怎么配它、CI 里怎么跑它。










