必须分开缓存 vendor/ 和 ~/.composer/cache:前者用 artifacts 传递,后者用 cache 复用;需显式设 composer_cache_dir、用 composer.lock 哈希作 key,并加 --no-interaction --prefer-dist --optimize-autoloader 参数。

GitLab CI 里 vendor/ 和 ~/.composer/cache 必须分开缓存
只缓存其中一个,CI 构建速度几乎不会提升。vendor/ 是构建产物,体积大、文件多,GitLab cache 恢复时容易超时或校验失败;而 ~/.composer/cache 存的是 zip 包和元数据,小且稳定,适合跨流水线复用。
实操建议:
- 在
cache:块中配置paths: ["~/.composer/cache"],key: "$CI_COMMIT_REF_SLUG"实现分支级隔离 - 在
artifacts:中声明vendor/,并设expire_in: 1 week,避免无限膨胀 - 后续作业(如 test)通过
dependencies: [build]直接复用 vendor/,跳过composer install - 务必在
before_script设置COMPOSER_CACHE_DIR: "$CI_PROJECT_DIR/.composer-cache",否则 Composer 默认写入/root/.composer/cache,该路径无法被 cache 捕获
CI 中 composer install 命令必须加 --no-interaction --prefer-dist --optimize-autoloader
缺任何一个,都可能卡住、变慢或运行时 autoload 失败。CI 环境没有 TTY,不加 --no-interaction 会等待输入;不加 --prefer-dist 会 fallback 到 --prefer-source,触发大量 git clone,极不稳定;--optimize-autoloader 不仅加速安装,更直接影响 runtime 性能。
常见错误现象:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 流水线卡在
Loading composer repositories with package information—— 很可能是没加--no-interaction - 日志里反复出现
Cloning into '/tmp/xxx'—— 说明--prefer-dist缺失或被覆盖 - PHP 报错
Class not found却确认类存在 ——--optimize-autoloader没启用,PSR-4 映射未生效
缓存失效的三个关键信号,比“慢”更值得警惕
构建时间变长只是表象,真正的问题是缓存没命中却误以为用了。以下三类日志一旦出现,说明缓存策略已失效:
-
Downloading https://repo.packagist.org/packages.json出现多次 ——~/.composer/cache没复用,检查cache:key是否混用了$CI_PIPELINE_ID导致过度隔离 -
Installing dependencies from lock file后紧跟着大量- Installing vendor/package (dev-main)—— 表明composer.lock被忽略或未提交,实际走的是composer update逻辑 - 同一 commit ID,两次构建生成的
vendor/autoload.php文件 md5 不一致 —— 多半是--classmap-authoritative或用户 UID 不一致导致 autoloader 路径硬编码失效
Docker 多阶段构建中 vendor/ 复制后 autoload 失效的根本原因
不是路径错了,而是 Composer 生成的 autoloader 依赖绝对路径,而多阶段复制后工作目录或 UID 变了,include 时找不到原始路径。最直接验证方式是构建完立刻跑:php -d display_errors=Off -r "require 'vendor/autoload.php';"。
容易踩的坑:
- final 阶段没设
WORKDIR /app,但 builder 阶段是WORKDIR /app——autoload.php里写的仍是/app/vendor,而 final 阶段当前目录不是/app - builder 阶段用 root 用户运行
composer install,final 阶段切到非 root 用户,导致vendor/下某些文件权限不可读 - 没加
--ignore-platform-reqs但构建环境 PHP 版本与config.platform.php不匹配,composer install表面成功,实际跳过部分包,autoload 一加载就报错
缓存本身不解决问题,它只放大你对 composer.lock 状态、路径一致性、用户权限和参数组合的理解程度。一个没被 git add 的 lock 文件,或者一次没同步的 WORKDIR,都会让所有缓存策略归零。










