--no-dev是生产环境硬性开关,彻底跳过require-dev包的解析、下载、安装及autoload注册;必须搭配干净composer.lock、--optimize-autoloader和--classmap-authoritative使用,否则仍存安全与性能风险。

no-dev参数不是“可选优化”,而是生产环境的硬性开关
--no-dev 会让 Composer 彻底跳过 require-dev 字段中声明的所有包:不解析、不下载、不安装、不写入 vendor/autoload.php 的 classmap 或 PSR-4 映射,也不会出现在 composer.lock 的 packages-dev 区块里。它不是“建议不装”,而是“根本不看”。漏掉这个参数,phpunit/phpunit、symfony/debug-bundle、laravel/pint 就会进线上 vendor/,带来体积膨胀、autoload 冗余、OPcache 效率下降,甚至 RCE 风险。
为什么只删 composer.json 的 require-dev 没用
常见误操作是手动删掉 composer.json 里的 require-dev 块,以为这样就能“干净上线”。但只要 composer.lock 文件里还存着 phpunit 或 mockery 的记录,composer install 就会照装——Composer 优先信任 lock 文件,而不是 json 文件。更危险的是,如果 lock 文件里有 packages-dev 数组或 packages 中混入 dev 包,--no-dev 会直接报错中断:“dev dependencies not found”。所以部署前必须确保 lock 文件“干净”:
- 在无
vendor/、无缓存的 CI 环境中运行composer install --no-dev,再提交生成的composer.lock - 打开
composer.lock搜索"packages": [,确认里面没有phpunit、symfony/debug-bundle等关键词 - 不要复用本地开发生成的 lock 文件,尤其当本地曾执行过
composer update且未加--no-dev
no-dev 必须搭配 optimize-autoloader 和 classmap-authoritative 才算真正生效
只加 --no-dev 还不够。如果不加 --optimize-autoloader,Composer 仍会走 PSR-4 文件扫描路径,而 dev 包的测试类路径(如 tests/)可能已被扫进 autoload_static.php;如果不加 --classmap-authoritative,即使 classmap 里没这些类,Composer 也会 fallback 到文件系统查找——一旦某个 dev 包的目录意外残留,就可能触发静默异常或 Class not found。正确组合是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction-
composer dump-autoload --no-dev不能替代 install 阶段的优化:它只刷新autoload_static.php,不会重建vendor/composer/autoload_classmap.php -
--ignore-platform-reqs和--no-dev完全无关,前者绕 PHP 版本检查,后者控制依赖范围
CI/CD 中 post-install-cmd 不会自动执行,别依赖它清理 dev 包
有人想在 post-install-cmd 里写 rm -rf vendor/phpunit 来“补救”,这是危险操作:vendor/autoload.php 里仍保留该包的 PSR-4 映射,运行时直接 Class not found。更关键的是,CI 环境(如 GitHub Actions)默认以 COMPOSER_DEV_MODE=0 运行,post-install-cmd 和 post-update-cmd 默认被禁用。解决方式只有两种:
- 显式启用钩子:
composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction && composer run-script post-install-cmd --no-dev - 改用自定义脚本名(如
deploy:post-install),并在 CI 步骤中明确调用:composer run deploy:post-install
最常被忽略的一点:--no-dev 只控制包是否安装,不影响框架配置。比如 Laravel 的 APP_DEBUG=true 和 --no-dev 没绑定关系——symfony/debug-bundle 虽没装上,但调试堆栈仍可能暴露。二者必须同步清理。










