composer install --no-dev是唯一可靠方式,它强制跳过require-dev字段所有包的下载、安装及autoload注册,确保仅部署生产依赖;需配合--optimize-autoloader、--no-interaction等参数,并依赖纯净的composer.lock文件。

composer install --no-dev 是唯一可靠方式
想让 composer install 只装生产环境真正需要的包,必须加 --no-dev。它不是“可选优化”,而是硬性开关——不加,require-dev 里的 phpunit、laravel/pint、roave/security-advisories 全都会进 vendor。
-
--no-dev会跳过require-dev字段所有包的下载、安装和 autoload 注册 -
--optimize-autoloader(或-o)只是生成更紧凑的类映射,跟是否装 dev 包完全无关 -
--ignore-platform-reqs绕过 PHP 版本检查,但不控制依赖范围,别误当过滤开关用
为什么不能靠 composer.json 配置自动区分?
Composer 不会智能识别“哪些是开发工具、哪些是运行时必需”——它只认字段名:require 下的包必装,require-dev 下的包默认也装,除非你明确告诉它跳过。
- 哪怕你在
require-dev里写了"phpstan/phpstan": "^1.10",composer install照样下、照样解压、照样写进 autoload - 没有
config.only-install-require这种配置项,也不存在“自动检测非运行时依赖”的机制 - 私有仓库、Git 分支、本地路径依赖,只要在
require-dev里,一样被--no-dev拦住
Docker 和 CI/CD 中漏掉 --no-dev 的典型症状
这些现象基本等于直接告诉你:没加 --no-dev。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 部署后报错
Class 'PHPUnit\Framework\TestCase' not found—— 实际上它已经被装进去了,只是没被 autoload;但更危险的是它占体积、带潜在安全风险 -
vendor/bin下出现phpcs、psalm、pest—— 它们不该出现在生产镜像里 - Docker 镜像比预期大 20MB+,
du -sh vendor/* | sort -h一查,symfony/var-dumper或barryvdh/laravel-debugbar占大头 -
composer show列出一堆没在require里声明的包,比如doctrine/dbal(仅用于 migration 工具)
install 和 update 都要加 --no-dev 吗?
要看场景,不是一刀切。
- 线上部署、Docker 构建、CI 测试后的发布阶段:用
composer install --no-dev --optimize-autoloader --no-interaction - CI 中需要更新生产依赖(比如修复安全漏洞):才用
composer update --no-dev,它会改composer.lock,但依然不碰require-dev - 日常开发环境:不需要
--no-dev,否则没法跑测试、没法用调试工具 - 千万别在生产机上跑
composer update不带--no-dev—— 一次临时调试可能就把phpunit永久留在生产环境里
真正容易被忽略的点是:--no-dev 必须显式写在命令里,环境变量如 COMPOSER_NO_INTERACTION=1 完全不影响依赖范围。少打这四个字符,就等于把整套 dev 工具链打包塞进生产容器。










