github actions 中 composer 加速必须三要素齐备:切对镜像源(验证 config -g 输出完整 json 且 url 含末尾斜杠)、缓存 ~/.composer/cache 而非 vendor/、安装时带 --no-dev --prefer-dist --optimize-autoloader --no-interaction 参数,缺一不可。

CI/CD里Composer不快,不是因为“没中文支持”,而是镜像没切对、缓存路径错了、参数漏了——三者齐备,安装耗时通常能从 3–5 分钟压到 30 秒内。
确认镜像源是否真生效
执行 composer config -g repo.packagist,输出必须是类似 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} 的完整 JSON 对象。空、null、只返回 URL 字符串、或仍是 https://packagist.org,都说明没生效。
- 常见失效原因:键名写成
repos.packagist(多一个s)、漏掉composer这个type值、URL 末尾缺/ - CI 脚本里用
sudo composer config -g,很可能写进了root的配置,但 runner 用户读不到;应改用当前用户身份执行 - 验证是否真走镜像:加
-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
- 如果
composer.json原本是"repositories": [](数组),命令会报错;需先手动改成"repositories": {}(对象)再执行 - 千万别手写
"packagist": false——这会彻底关掉基础包源,镜像临时不可用时,composer install直接失败 - 改完后建议跑一次
composer update --lock,确保composer.lock记录新源地址
缓存 ~/.composer/cache,别碰 vendor/
vendor/ 缓存看似快,实则危险:不同 PHP 版本、扩展开关(如 ext-apcu)、甚至文件系统大小写敏感性,都会导致生成的 autoload 文件不兼容,上线后随机报 Class not found 或 Cannot declare class。
- 真正该缓存的是
~/.composer/cache——它只存 zip/dist 包,与环境完全解耦,只跟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 中必须带的 install 参数组合
composer install 在 CI 里不能只求“能跑”,得同时满足可重现、安全、性能三要素。漏一不可:
-
--no-dev:跳过require-dev中的包(如 phpunit),否则上线后可能因class_exists('PHPUnit\Framework\TestCase')直接 fatal -
--prefer-dist:优先下载预构建 zip 包,避免 Git clone 失败、SSH 密钥缺失、协议阻塞等问题 -
--optimize-autoloader(或-o):生成vendor/composer/autoload_classmap.php,绕过 PSR-4 运行时扫描,类加载提速 50% 以上 -
--classmap-authoritative:强制 autoloader 完全信任 classmap,不再 fallback 到file_exists()探测——这是防止Class not found的最后一道防线 -
--no-interaction和--no-progress:禁用交互提示和进度条,避免流水线卡住或日志解析失败
注意:--classmap-authoritative 必须与 --no-dev 同时使用;否则 dev 类虽不装,运行时判断仍会触发 fatal。










