ci/cd中composer install必须加--no-dev、--optimize-autoloader、--classmap-authoritative三个参数,否则易致线上类加载失败或性能崩溃;漏一不可。

CI/CD 中直接用 composer install 而不加关键参数,大概率导致线上类加载失败或性能崩溃;必须显式控制环境、依赖范围和自动加载行为。
CI/CD 里执行 composer install 的三个硬性参数
在 GitHub Actions、GitLab CI 或 Jenkins 的部署步骤中,composer install 绝不能裸写。漏掉任一参数都可能让构建产物无法在线上运行:
-
--no-dev:跳过require-dev中的包(如phpunit、infection),避免将测试工具、静态分析器打入生产环境 -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,绕过 PSR-4 文件扫描,类加载提速 50% 以上 -
--classmap-authoritative:配合前一个参数,强制 Composer 完全信任类映射表,不再 fallback 到文件系统查找——这是防止Class not found的最后一道防线
正确写法示例:composer install --no-dev --optimize-autoloader --classmap-authoritative
post-install-cmd 在 CI/CD 中默认不执行?原因和解法
CI 环境(如 GitHub Actions)通常以 COMPOSER_DEV_MODE=0 运行,此时 post-install-cmd 和 post-update-cmd 默认被禁用——不是 bug,是 Composer v2+ 的安全策略。
解决方式只有两种:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 显式启用钩子:
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影响,逻辑更可控
别依赖 post-install-cmd 自动触发,它在 CI 里基本等于“不可靠”。
如何让 CI 构建产物可直接部署到目标机
CI 不该只负责“跑通”,还要产出能直接上线的干净包。关键动作不是 rsync 整个目录,而是构建 + 验证 + 打包三步闭环:
- 构建阶段:先
npm run build(如有前端),再composer install --no-dev --optimize-autoloader --classmap-authoritative - 验证阶段:运行
php -m | grep opcache确认 OPcache 可用;用php -r "include 'vendor/autoload.php'; echo 'OK';"快速验 autoload - 打包阶段:用
tar -czf release.tar.gz --exclude=.git --exclude=tests --exclude=phpunit.xml --exclude=.env* .,确保不带敏感文件和开发残留
打包后上传到对象存储或制品库,再由部署机下载解压——比在目标机上现场 composer install 更稳定,也规避了目标机 PHP 环境差异问题。
为什么不要在 CI 里 ssh 到生产机执行 composer install
看起来省事,实则埋下四个雷:
- CI 机器与目标机 PHP 版本、扩展(如
mbstring、curl)不一致时,composer install可能静默失败或生成错误 autoloader - 网络中断会导致远程安装卡住,CI 流水线超时失败,但目标机上已残留半截
vendor/ - 没有原子性:若
rsync同步代码后 ssh 执行composer install失败,线上服务就处于“代码新、依赖旧”的错配状态 - 权限混乱:
www-data用户无法写vendor/,而用root执行又违反最小权限原则
真正健壮的做法是:CI 构建完整可运行包 → 上传 → 部署机用 tar -xzf 原子解压 → chown 权限 → 切换软链(如 ln -sf release-20260501 current)。










