生产环境应使用 composer install --no-dev 跳过开发依赖安装,推荐搭配 --optimize-autoloader 和 --classmap-authoritative 提升性能,并在 CI/CD 和 Dockerfile 中显式声明,避免安全风险与体积膨胀。

生产环境不应安装 --dev 标记下定义的依赖包,因为它们仅用于开发和测试,比如 PHPUnit、PHPStan、debug 工具等,不仅增加部署体积,还可能引入安全风险或运行时冲突。
部署时跳过 dev 依赖
Composer 默认在部署时会安装 require-dev 中的所有包。要避免这点,只需在生产环境执行:
-
composer install --no-dev:完全忽略require-dev区块,不安装任何开发依赖 -
composer install --optimize-autoloader --no-dev:推荐组合,同时生成优化的类映射,提升加载性能
确保 production 模式生效
Composer 会根据 COMPOSER_ENV 或 APP_ENV(Laravel 等框架)判断环境,但真正起作用的是 --no-dev 参数本身。即使 "config": {"preferred-install": "dist"} 或 "minimum-stability": "stable" 存在,也不影响 dev 包是否安装——关键还是命令行参数。
CI/CD 和构建脚本中注意
很多部署流程会在构建阶段运行 composer install,若未显式加 --no-dev,就会把 dev 包一起打进生产镜像或发布包。建议:
- Dockerfile 中写成:
RUN composer install --no-dev --optimize-autoloader --classmap-authoritative - GitLab CI / GitHub Actions 的 job 脚本里明确指定
--no-dev - 避免使用
composer update在生产服务器上执行,应只在本地或构建机更新 lock 文件
验证是否干净
上线前可快速检查:进入线上项目目录,运行
-
composer show --dev:应返回空或提示“no packages”,否则说明 dev 包被装进来了 -
ls vendor/ | grep -E "(phpunit|psr/log|symfony/debug)":手动确认常见 dev 工具是否残留










