没有一键移除所有 require-dev 包的原生命令,因 composer 不支持通配符语法且需避免隐式依赖冲突;安全方式包括显式列出包名、手动清空后 install --no-dev 或用 jq 脚本处理,并须执行 install --no-dev、dump-autoload -o 及 verify depends。

没有“一键移除所有 require-dev 包”的原生命令。 Composer 不支持 composer remove --dev * 或类似通配符语法,强行清空 require-dev 必须配合明确策略,否则极易破坏依赖树或留下残留。
为什么不能直接用 composer remove --dev 批量删空
Composer 的 composer remove 要求显式列出每个包名,不接受通配符、正则或自动枚举。即使你写 composer remove --dev a/b c/d,它也只是删这两个——不会自动遍历 require-dev 里全部条目。更关键的是:很多 require-dev 包被 require 中的包(如 phpstan/phpstan 拉 phpunit/phpunit)隐式依赖,硬删会触发 Package is required by another package 报错并中止。
安全批量清空 require-dev 的三种可行方式
以下按推荐度排序,全部基于当前 Composer 2.5+ 行为:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 明确列出要删的包:
composer remove --dev phpunit/phpunit friendsofphp/php-cs-fixer behat/behat—— 多个包名用空格分隔,不加引号;命令原子执行,失败即回退 - 手动清空
require-dev块后重建:
编辑composer.json,将"require-dev": { ... }改为"require-dev": {},保存后运行composer install --no-dev—— 注意这会重装所有剩余require包,可能触发版本漂移 - 用
jq脚本自动化(仅限 Linux/macOS):jq 'del(.require-dev)' composer.json | sponge composer.json && composer update --no-dev—— 需提前安装jq和moreutils;Windows 用户需改用 PowerShell 等效逻辑
删完必须补的关键动作
仅执行 remove 或改 composer.json 不等于真正清理干净:
-
composer install --no-dev必须运行 ——composer remove --dev不会主动删磁盘文件,只是更新声明和锁文件;不重建 vendor,旧包代码仍留在vendor/里 -
composer dump-autoload -o必须运行 —— 否则vendor/composer/autoload_psr4.php中的tests/、stubs/等 dev-only 路径映射可能残留,导致类仍可加载 - 检查
composer show phpunit/phpunit应返回Package not found—— 这是唯一可信验证,终端提示“已移除”不可信,中断后可能残留条目
真正难的不是删,而是确认没被其他包悄悄续上依赖链。删完跑一次 composer depends phpunit/phpunit,如果仍有输出,说明某个 require 包还在拉它——这时候删的只是声明,不是实际依赖。










