ci/cd中禁用composer update,因其会重解析依赖树、更新composer.lock,破坏构建可重现性;必须提交composer.lock并仅运行composer install。

CI/CD里为什么不能用composer update
CI/CD流程不是开发环境,它不负责“选版本”,只负责“精确还原”。composer update会重解析整个依赖树、更新composer.lock,导致构建不可重现——昨天通过的流水线,今天可能因一个monolog的patch升级而失败。
必须确保composer.lock已提交到Git,CI中只运行composer install。如果CI报Lock file operations: 1 install, 0 updates, 0 removals却卡住,大概率是PHP扩展缺失(比如ext-zip没装),不是命令问题。
- CI脚本里出现
composer update,应立刻删除 - 本地开发改了
composer.json后,需手动运行composer update并提交新composer.lock,再推送到CI - CI中若检测到
composer.lock未提交,install会直接退出,不会帮你生成
缓存什么、怎么缓存才真正有效
缓存vendor/看似快,实则危险:不同PHP版本、不同平台生成的autoloader不能混用,缓存错版本会导致Class not found或Cannot declare class。真正该缓存的是Composer自己的下载包缓存目录——它跟环境无关,只跟composer.lock哈希绑定。
GitHub Actions推荐这样写:
- name: Cache Composer packages
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }}
GitLab CI用cache:关键字,路径填~/.composer/cache,别写vendor。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 缓存失效最常见原因:本地手动生成了新
composer.lock但没提交,导致key不匹配 - CI中不要缓存
vendor,除非你严格锁定PHP版本、扩展、OS和Composer版本 - 换镜像源后务必执行
composer clear-cache,否则旧源还在内存里苟着
--prefer-dist和--optimize-autoloader不是可选项
--prefer-dist让Composer优先下载预构建的zip/tar包,而非clone整个Git仓库。这对CI尤其关键:避免SSH密钥缺失、Git协议阻塞、网络超时等问题。私有源若无dist包会fallback到source,但公共包99%都有dist。
--optimize-autoloader把PSR-4映射编译成静态数组;--classmap-authoritative则彻底禁用file_exists()试探——两者合用能让autoload性能提升数倍,且是生产环境底线配置。
- CI部署命令应为:
composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative --no-interaction - 已存在
"config": {"prefer-source": true}的项目,prefer-dist不会覆盖它,必须手动删掉prefer-source -
--classmap-authoritative在本地开发慎用,否则新增类不运行dump-autoload就直接报错
镜像源和PHP环境比“并行下载”重要得多
Composer 2.x已原生支持并发下载(parallel-downloads),但实际瓶颈从来不在并发数,而在源站延迟和PHP扩展缺失。国内用户不换镜像源,prefer-dist也救不了——包下载不动,再快的解压也是空谈。
必须做三件事:
- 全局设镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 关掉xdebug:
php -m | grep xdebug检查,它会让composer.lock解析慢3–5倍 - 确认基础扩展已装:
ext-zip、ext-openssl、ext-pcre缺一不可
别再装hirak/prestissimo了,它在Composer 2.x中已失效,甚至可能引发静默降级为单线程。










