CI/CD中必须用composer install而非update,否则构建不可重现;卡住主因是PHP扩展缺失、版本不匹配或私仓认证失败,需加--no-dev、--optimize-autoloader、--classmap-authoritative等参数,缓存应选~/.composer/cache而非vendor/。

CI/CD 里必须用 composer install,绝不能用 composer update —— 否则构建不可重现,线上行为随时可能突变。
为什么 CI 报 Lock file operations: 1 install, 0 updates, 0 removals 就卡住?
这不是网络慢或命令写错,而是环境层面出了问题:
-
ext-zip、ext-pdo、ext-xml缺失(尤其 Alpine 或最小化 PHP 镜像里默认不装) - PHP 版本低于
composer.json中"php": "^8.1"要求,Composer 会静默跳过部分包,导致 autoloader 缺类 - 私有仓库认证失败(如 GitLab 私仓),不会报
Authentication failed,而是卡在下载环节
验证方式:CI 开头加 php -v 和 composer show --platform 对比;私仓用 composer config http-basic.repo.example.com $USERNAME $TOKEN 动态注入凭证,别提交 auth.json。
composer install 必须带的参数有哪些?
漏掉任一参数,轻则 autoload 慢 2–3 倍,重则运行时报 Fatal error: Class 'PHPUnit\Framework\TestCase' not found:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev:跳过require-dev,否则 phpunit、debug-bundle 进 vendor,暴露调试接口且增大镜像体积 -
--optimize-autoloader(或-o):生成vendor/composer/autoload_classmap.php,把 PSR-4 映射编译成静态数组,绕过实时文件扫描 -
--classmap-authoritative:告诉 autoloader “classmap 里没有的类,就真的不存在”,禁用file_exists()探测 -
--no-interaction和--no-progress:防止卡在交互提示或进度条渲染上
注意:--no-dev 影响 classmap 生成逻辑——漏了它,class_exists('PHPUnit\Framework\TestCase') 会直接 fatal,得改用 class_exists(..., false) 或先 function_exists() 兜底。
该缓存 vendor/ 还是 ~/.composer/cache?
缓存 vendor/ 是常见但危险的做法:
- 不同 PHP 版本、不同扩展、不同平台生成的 autoloader 不能混用,复用错版本会导致
Class not found或Cannot declare class -
~/.composer/cache只存 dist zip、git clones、metadata,跟环境无关,只跟composer.lock哈希绑定,才是安全高效的缓存目标 - GitHub Actions 推荐 key 写成
${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - GitLab CI 别把
vendor/写进cache.paths,除非你用 lock 哈希做二级 key 并确保 PHP platform 严格一致
缓存失效最常见原因:本地手动生成新 composer.lock 又没提交,导致 key 不匹配,每次走冷安装。
真正难的不是写对命令,而是让所有角色(开发者、CI 工程师、运维)都理解:CI 不是开发环境的镜像,它只负责精确还原。一旦有人在脚本里偷偷加了 update,或者漏了 --classmap-authoritative,问题往往在线上凌晨三点才爆发。

















