CI中composer install慢90%非网络问题,而是缓存未挂载、参数缺失或镜像未生效;应挂载COMPOSER_CACHE_DIR、使用--no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs组合参数,并通过--repository-url或项目级repositories配置确保镜像生效。

CI 里 composer install 慢,90% 不是网络问题,而是缓存没挂对、参数漏了、或镜像根本没生效。
为什么 CI 中 composer install 总卡在 “Installing dependencies”
这不是 Composer 本身慢,是每次都在重复三件事:重新下载 ZIP 包、解压进 vendor/、生成 autoload 映射。CI 容器冷启动 + 默认不复用缓存 = 每次从头来。
- 没挂载
~/.composer/cache或COMPOSER_CACHE_DIR:ZIP 包无法复用,哪怕 lock 文件没变也重下 - 没设
--prefer-dist:默认可能走 git clone,比 ZIP 慢 3–5 倍,且不命中 cache - 没加
--no-progress:输出大量进度条文本,拖慢流水线日志处理 - 镜像 URL 少了末尾
/(如https://mirrors.aliyun.com/composer):Composer 2.2+ 会静默 fallback 到官方源,composer diagnose还显示正常
CI 脚本里必须加的参数组合
别拼凑,直接用这串:composer install --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs。少一个都可能出问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-interaction:跳过所有交互提示(包括 GitHub OAuth、post-install-cmd 的 confirm) -
--prefer-dist:强制走 ZIP 包安装,能命中cache/files/下的已下载包 -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,跳过运行时目录扫描 -
--ignore-platform-reqs:CI 镜像常缺ext-zip或ext-openssl,不加这个会静默失败或跳过关键步骤
缓存路径和 key 怎么设才真正生效
只缓存 vendor/ 是高风险操作——PHP 版本微升级、扩展变动、甚至 composer.lock 哈希变化,都会导致缓存失效却无报错。
- 固定缓存路径:
export COMPOSER_CACHE_DIR=/tmp/composer-cache(确保该路径可写且跨 job 持久化) - Cache key 必须基于
composer.lock内容哈希,不是分支名:key: $CI_COMMIT_REF_SLUG-composer-${CI_PROJECT_DIR}/composer.lock(GitLab)或key: ${{ hashFiles('**/composer.lock') }}(GitHub Actions) - 只缓存
COMPOSER_CACHE_DIR目录,不要缓存vendor/;每次install都应重建vendor/,保证完整性校验
镜像配置在 CI 中为何经常失效
全局配置(composer config -g)在 Jenkins、宝塔、systemd 服务中大概率不生效,因为执行命令的用户(如 www 或 jenkins)跟你的登录用户不是同一个。
- CI 脚本里别依赖全局配置,改用临时参数:
composer install --repository-url=https://mirrors.aliyun.com/composer/ - 验证镜像是否真生效:
composer config -g repo.packagist输出必须是完整 JSON,形如{"type":"composer","url":"https://mirrors.aliyun.com/composer/"},且url末尾有且仅有一个/ - 项目级配置更可靠:手动编辑
composer.json,在repositories里加"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},并在根节点写"packagist.org": false
最易被忽略的是:镜像只加速元数据请求和 ZIP 下载,不影响依赖解析阶段。如果 composer update 卡在 Resolving dependencies,换镜像没用,得检查 composer.json 里的版本约束是否太宽泛,或者是否启用了 xdebug。

















