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

CI/CD 中裸写 composer install 几乎必然失败,必须显式控制环境、依赖范围和自动加载行为——漏掉任一参数,线上就可能 Class not found 或性能崩塌。
CI 环境下 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
为什么 GitHub Actions 里总报“command not found”或“no composer.json”?
根本不是网络问题,而是 runner 默认没切到项目根目录,也没检出 composer.json 和 composer.lock。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 第一步必须用
uses: actions/checkout@v4,且不能设submodules: false(若依赖含 Git 子模块) - 后续所有步骤要么统一加
working-directory: ${{ github.workspace }},要么在run前手动cd ${{ github.workspace }} - 务必在日志开头加
ls -la,确认composer.json和composer.lock真的存在
PHP 环境和缓存怎么配才不翻车?
Ubuntu runner 默认没有 composer 命令,也常缺 ext-zip、ext-xml 等扩展——composer install 启动即校验,缺一个就退出。
- 别用
sudo apt install composer:Ubuntu 官方源版本老旧(常是 v2.0.x),且不保证与 PHP 版本匹配 - 用
shivammathur/setup-php@v2,显式指定php-version(必须和composer.json中"php": "^8.2"一致)和extensions(至少mbstring、xml、zip、curl) - 缓存路径应设为
~/.composer/cache,不是vendor/——前者复用率高、恢复快、跨 OS 稳定;后者体积大、易权限异常、缓存命中率低
post-install-cmd 在 CI 里为啥不执行?
不是 bug,是 Composer v2+ 的安全策略:COMPOSER_DEV_MODE=0 时,默认禁用 post-install-cmd 和 post-update-cmd。
- 别指望它自动触发——在 CI 里基本等于“不可靠”
- 解法只有两种:
– 显式启用钩子: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 - 注意:如果脚本里用了
@php artisan,得确保artisan路径正确、PHP 版本一致,且vendor/autoload.php已加载
真正容易被忽略的是:CI 构建产物必须可直接部署,而不是只跑通。构建后要验证 autoload 是否可用(php -r "include 'vendor/autoload.php'; echo 'OK';"),再打包排除 .git、tests、.env* 等敏感项——否则上线那一刻,才是问题真正开始的时候。

















