根本原因是默认行为在ci中严重低效:反复解析依赖、下载完整包、解压并生成autoloader,而干净容器和未预热缓存加剧问题;必须使用--no-interaction、--no-scripts、--prefer-dist三参数组合优化。

为什么 composer install 在 CI 里总卡住?
根本原因不是 Composer 慢,而是默认行为在 CI 环境下严重低效:它会反复解析依赖、下载完整包、解压并生成 autoloader,而这些动作在每次构建中几乎完全重复。CI 通常用干净容器启动,vendor/ 不复存在,缓存也未预热。
必须加的三个关键参数
只运行 composer install 而不加参数,等于主动放弃所有优化机会。以下三项缺一不可:
-
--no-interaction:禁用交互式提示(CI 无 TTY),避免卡在“Do you want to store credentials?”之类的问题上 -
--no-scripts:跳过post-install-cmd等钩子——除非你明确需要它们(比如生成配置或清缓存),否则它们常是耗时大户且易失败 -
--prefer-dist:强制走压缩包安装而非 Git clone,下载体积小、解压快;CI 环境不需要源码历史,--prefer-source只会拖慢构建
组合起来就是:composer install --no-interaction --no-scripts --prefer-dist
缓存 vendor/ 和 ~/.composer/cache 的实操要点
CI 平台(GitHub Actions、GitLab CI、CircleCI)都支持路径级缓存,但只缓存 vendor/ 是常见误区——它体积大、变动频繁、恢复慢;真正该优先缓存的是 Composer 自身的包缓存目录 ~/.composer/cache,它体积稳定、复用率高、恢复极快。
示例(GitHub Actions):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
steps:
- uses: actions/cache@v4
with:
path: ~/.composer/cache
key: composer-cache-${{ runner.os }}-${{ hashFiles('**/composer.lock') }}
注意:key 中必须包含 composer.lock 的哈希,否则 lock 文件变更后仍用旧缓存,导致依赖不一致。
额外提醒:不要盲目缓存 vendor/。若项目含大量私有包或自建 Packagist,~/.composer/cache 缓存可能失效,此时才考虑配合 COMPOSER_CACHE_DIR 环境变量统一指向缓存路径。
composer install 前要不要删 vendor/?
绝大多数 CI 场景下,不需要手动执行 rm -rf vendor/。现代 CI 运行器(如 GitHub Actions 的 ubuntu-latest)默认提供干净工作区;即使有残留,composer install 本身就会覆盖已有内容。强行删除反而增加 I/O 开销,还可能因权限问题失败(比如某些 runner 以非 root 用户运行,vendor/ 由前次构建的 root 创建)。
唯一例外是:你明确启用了 COMPOSER_VENDOR_DIR 并复用同一路径做多项目构建——这时需清理,但这种用法本身已偏离标准 CI 实践。
真正要盯紧的,是 composer.lock 文件是否被提交、是否与 composer.json 同步。CI 中任何绕过 lock 文件的行为(比如用 composer update 替代 install)都会让优化失效,且引入不可控依赖变更。










