ci/cd中必须用composer install而非update以确保构建可重现;需提交composer.lock、缓存~/.composer/cache、加--no-dev--optimize-autoloader--classmap-authoritative参数,并校验php版本与扩展、设置composer_memory_limit。

CI/CD 里必须用 composer install,绝不能用 composer update——否则构建不可重现,线上行为随时漂移。
为什么 CI 中 composer install 会卡住或失败
常见现象不是命令写错,而是环境不满足隐性前提:
-
composer.lock文件未提交到 Git:CI 拉下来的代码里没有它,composer install直接报错退出 - PHP 扩展缺失:比如
ext-zip、ext-pdo、ext-openssl没装,尤其 Alpine 镜像需手动apk add php81-zip类似操作 - PHP 版本不匹配:
composer.json中"php": "^8.1",但 CI 使用的是 8.0,部分包会被跳过或静默失败 - 内存不足:Composer 解析依赖图时峰值内存高,CI 默认限制常触发
Killed或Allowed memory size exhausted
解决方法是在 CI 脚本开头加:export COMPOSER_MEMORY_LIMIT=-1,别指望 php -d memory_limit=-1 composer install——多数 CI 镜像里这招不生效。
composer install 必须带哪些参数才适合生产部署
不加这些参数,autoload 性能就是瘸腿的:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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、phpstan),避免体积膨胀和安全风险 -
--optimize-autoloader(或-o):把 PSR-4 映射编译成静态数组,跳过运行时目录扫描 -
--classmap-authoritative:告诉 autoloader “不在 classmap 里的类,一律不存在”,彻底禁用file_exists()探测
三者必须一起用。漏掉 --classmap-authoritative,哪怕开了 --optimize-autoloader,PHP 仍会 fallback 到文件系统试探,IO 开销照旧;漏掉 --no-dev,又可能因 class_exists('PHPUnit\Framework\TestCase') 这类判断直接 fatal。
缓存该缓 vendor/ 还是 ~/.composer/cache
缓存 vendor/ 看似快,实则埋雷:不同 PHP 版本、不同平台生成的 autoloader 不能混用,缓存错版本会导致 Class not found 或 Cannot declare class。真正该缓存的是 Composer 自己的下载包缓存目录——它跟环境无关,只跟 composer.lock 哈希绑定。
- GitHub Actions 推荐这样写:
path: ~/.composer/cache,key里必须包含${{ hashFiles('**/composer.lock') }} - GitLab CI 用
cache:关键字,路径填~/.composer/cache,别写vendor - 缓存失效最常见原因:
composer.lock被意外修改(比如本地手动生成又没提交),导致 key 不匹配,每次走冷安装
CI 中怎么安全调用 composer.json 里的自定义 scripts
composer.json 里的 "scripts" 不是装饰项,而是 CI 命令标准化的核心:
- 比如你写了
"test": "phpunit --configuration phpunit.xml",CI 就该统一跑composer test,而不是直接调phpunit——这样既解耦了工具路径,又能让所有环境共用同一套执行逻辑 - 支持带参数透传:
composer test -- --filter=TestLogin会完整传给 PHPUnit - 避免在 script 中硬编码路径(如
./vendor/bin/phpunit),应依赖 Composer 的 bin 自动发现机制
最容易被忽略的一点是:--no-interaction 和 --no-progress 必须显式加上,否则 CI 可能在交互提示或进度条渲染上卡住——这不是 bug,是默认行为。










