composer install --no-dev是唯一可靠方式,它彻底跳过require-dev包的解析、下载、安装及autoload注册;必须配合--optimize-autoloader和--no-interaction使用,确保生产环境纯净、高效、自动化。

composer install --no-dev 是唯一生效方式
加 --no-dev 才能真正跳过 require-dev 里的包,不下载、不写入 vendor/、不注册 autoload-dev 映射。别信 --optimize-autoloader 或 --ignore-platform-reqs 能替代它——前者只优化加载速度,后者绕的是 PHP 版本检查,跟是否装 dev 包完全无关。
常见错误现象包括:Class 'PHPUnit\Framework\TestCase' not found(说明 phpunit/phpunit 被装进生产环境了)、vendor/bin/psalm 或 vendor/bin/pint 存在、Docker 镜像体积莫名大出 20MB+。这些基本都指向漏了 --no-dev。
-
composer install默认把require和require-dev全部装上,Composer 不会“智能识别”哪些是开发工具 - 删掉
composer.json里的require-dev再跑install没用——composer.lock还存着旧记录,照样还原 -
config.platform对require-dev完全无效,设了"php": "8.2"也拦不住symfony/var-dumper
CI/CD 和 Docker 构建必须组合使用三个参数
单靠 --no-dev 不够稳妥,线上部署建议固定搭配:
-
--no-dev:核心过滤,排除所有require-dev包 -
--optimize-autoloader:生成静态 classmap,避免运行时文件扫描,提升加载性能 -
--no-interaction:防止因权限确认、配置提示等交互卡住自动化流程
顺序无关紧要,但三者应同时出现。例如 Dockerfile 中写成:
RUN composer install --no-interaction --no-dev --optimize-autoloader
注意:COMPOSER_NO_INTERACTION=1 环境变量不能代替 --no-dev,它只控制交互行为,不控制依赖范围。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
别用 replace 或 conflict 替代 --no-dev
replace 和 conflict 是解决特定冲突的辅助手段,不是生产依赖精简的正路:
-
"replace": { "phpunit/phpunit": "*" }会让 Composer “假装已存在”,但它不阻止 autoload-dev 注册,也不影响vendor/autoload.php里残留映射,上线前还得手动确认composer show phpunit/phpunit是否真没装 -
"conflict": { "symfony/polyfill-mbstring": ">=1.30.0" }会在解析阶段报错中断,但若某个你直接require的包硬依赖它,整个update就失败,无法静默跳过 - 这两种方式都绕不开
require-dev的本质问题:90% 的冗余包就只是开发期工具,--no-dev是唯一语义明确、官方支持、可复现的开关
容易被忽略的细节:lock 文件和 install/update 的区别
composer install --no-dev 基于现有 composer.lock 安装,安全、快速、可复现;而 composer update --no-dev 会重算依赖图,可能意外引入新版本,日常部署中不该用。
更关键的是:即使 composer.lock 是在带 require-dev 的开发环境下生成的,install --no-dev 仍能正确读取并只安装 require 部分——它不修改 lock 文件,也不依赖 lock 文件里是否包含 packages-dev 区块。
漏掉这个细节,就可能让 roave/security-advisories 或 larastan 这类只该在 CI 里跑的包,跟着一起进生产容器。










