必须执行composer config -g repo.packagist确认输出为https://mirrors.aliyun.com/composer/等国内镜像URL,为空或仍显示packagist.org说明未生效;CI中需用--no-dev --prefer-dist --optimize-autoloader --classmap-authoritative等参数组合,并缓存~/.composer/cache而非vendor。

CI/CD 里 Composer 下载慢,不是网络问题,是没配对镜像源、没管缓存路径、没锁安装参数——三者缺一,提速就打折扣。
怎么确认镜像源真生效了
执行 composer config -g repo.packagist,输出必须是类似 https://mirrors.aliyun.com/composer/ 的 URL。如果为空、null 或仍是 https://packagist.org,说明配置没落进实际运行命令的用户环境里。
- CI 脚本里用
sudo composer config -g,很可能写进了root的~/.composer/config.json,但构建容器里跑的是runner用户,根本读不到 - 拼错字段名(比如写成
repos.packagist多了个s)会静默失败,composer config -g repo.packagist查出来还是空 - 验证是否真走镜像:加
-vvv运行composer install,日志里出现GET https://mirrors.aliyun.com/composer/p2/...才算成功
项目级配置比全局配置更可靠
在项目根目录运行:composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/。它会自动往 composer.json 的 repositories 字段安全追加,不覆盖已有私有源。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 适合 CI 场景:配置随代码提交,所有人行为一致,避免不同镜像混用导致 hash 不一致
- 如果
composer.json里已有"repositories": [](数组格式),命令会报错;得先手动改成"repositories": {}(对象)再执行 - 别手写
"packagist.org": false—— 这会彻底关掉官方源,镜像临时不可用时,composer install直接失败 - 换源后首次
install若报 hash 校验失败,删掉vendor/和composer.lock重来即可
缓存 ~/.composer/cache,别缓存 vendor/
vendor/ 缓存看似快,实则危险:不同 PHP 版本、扩展或 OS 下生成的 autoloader 不能混用,缓存错版本会导致 Class not found 或 Cannot declare class。
- 真正该缓存的是
~/.composer/cache—— 它只跟composer.lock哈希绑定,与环境无关 - GitHub Actions 示例:
path: ~/.composer/cache,key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - GitLab CI 示例:
cache: key: ${PHP_VERSION}-composer-cache; paths: - ~/.composer/cache - 缓存失效最常见原因:本地生成了新
composer.lock但没提交,导致 key 不匹配
CI 中必须用的安装参数组合
CI 部署命令应为:composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative --no-interaction --no-scripts --no-progress。漏掉任一关键项,都可能让构建变慢或出 runtime 错误。
-
--prefer-dist:强制走 zip 包下载,避开 Git clone、SSH 密钥、协议阻塞等问题 -
--optimize-autoloader+--classmap-authoritative:编译 PSR-4 映射为静态数组,并禁用file_exists()探测,autoload 性能提升数倍 -
--no-dev:跳过require-dev,减小体积、缩短时间;测试阶段可单独保留 -
--no-scripts:防止post-install-cmd等钩子在 CI 中意外执行耗时操作(如前端构建)
CI 中绝不能出现 composer update —— 它会重解析依赖树、更新 composer.lock,破坏构建可重现性。所有版本变更必须由开发者本地 update 后提交新 lock 文件。

















