生产环境部署必须加 --no-dev,否则会安装 dev 依赖,浪费资源并引入安全风险;仅线上服务器执行 composer install/update 时需添加,ci/cd、开发、测试环境不可加。

生产环境部署必须加 --no-dev,否则会安装 dev 依赖(如 PHPUnit、phpstan、faker 等),不仅浪费磁盘和内存,还可能引入安全风险或运行时冲突。
什么时候必须用 --no-dev
只在生产服务器上执行 composer install 或 composer update 时需要。CI/CD 构建阶段、本地开发、测试环境都不该加——那些地方需要 require-dev 里的工具。
- 线上服务器首次部署或更新代码后执行
composer install,必须加--no-dev - 若已运行过不带
--no-dev的安装,先删掉vendor/再重装,仅删composer.lock不够 -
composer install --no-dev只读取composer.lock,不重新解析依赖;没 lock 文件会报错,不是回退到require区块
--no-dev 和 --optimize-autoloader 通常一起用
两者解决不同问题,但部署时几乎总是一起出现:--no-dev 控制装哪些包,--optimize-autoloader(简写 -o)优化自动加载性能。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--optimize-autoloader会把 PSR-4/PSR-0 映射生成为静态数组,跳过文件系统扫描,对 Laravel、Symfony 等框架有明显启动加速 - 它只对
autoload配置生效,不影响autoload-dev;所以即使加了--no-dev,这个优化仍有效 - 常见部署命令是:
composer install --no-dev --optimize-autoloader --no-interaction
为什么 composer install --no-dev 有时不生效?
最常见原因是:你根本没在目标机器上运行 install,而是直接拷贝了本地 vendor/ 目录——本地装了 dev 依赖,线上就也有了,--no-dev 完全没机会起作用。
- 检查线上
vendor/是否真由composer install --no-dev生成:运行ls vendor/ | grep -E 'phpunit|phpstan|mockery|faker',有结果说明没生效 -
composer.json里require-dev的包如果被require中某个包间接依赖,它们仍会被装进来——--no-dev只跳过require-dev显式声明的包,不干预传递依赖 - 某些 CI 脚本用
composer update --no-dev替代install,这会导致线上 lock 文件被意外更新,破坏可重现性
真正可靠的部署,是让服务器自己跑 composer install --no-dev -o,且确保 composer.lock 已提交到 Git。任何绕过这一步的“捷径”,迟早暴露为权限、版本或安全问题。










