composer install在--prefer-source(VCS)模式下完全不走Composer缓存,因其强制执行git clone,跳过cache/files/中所有ZIP包,连cache-dir都不访问;提速需依赖Git层优化,如配置github-protocols https、启用浅克隆或CI中缓存.git目录。

composer install 为什么在 VCS 模式下完全不走缓存
因为 --prefer-source(即 VCS 模式)会强制 clone Git 仓库,跳过所有 ZIP 包缓存逻辑。缓存目录里 files/ 下的 monolog-monolog-6a8c4b5.zip 这类文件根本不会被读取——Composer 直接走 git clone,连 cache-dir 都不碰。
想用 VCS 又要提速,只能靠 Git 层面优化
VCS 模式本身无法复用 Composer 缓存,但你可以控制 Git 行为来减少重复开销:
- 配置
github-protocols强制走https而非git协议:运行composer config -g github-protocols https,避免 SSH 密钥协商和代理阻塞 - 启用 shallow clone:在项目级
composer.json中加"preferred-install": {"your-vendor/*": "source"},再配合"fxp-asset": {"vcs-driver-options": {"github-no-api": true, "no-tags": true}}(需装fxp/composer-asset-plugin,仅限旧版 Composer 1.x) - 私有 Git 仓库建议用
https+ token 认证,而非git@;后者在 CI 中易因 SSH agent 缺失失败,且无法被 GitHub Actions 的actions/cache复用
哪些场景真该坚持用 --prefer-source
不是所有 VCS 使用都合理。以下情况才值得牺牲缓存换 source:
- 你正在调试一个包的某次 commit,需要改代码、打 patch、本地
git checkout - 私有包未打 tag,只靠
dev-master或分支名引用,而镜像源不支持分支元数据同步(如部分私有 Packagist 替代品) - CI 构建中需提取
.git目录信息(如生成版本号),此时--prefer-dist解压后无.git
其他情况,尤其是生产部署或常规 CI,--prefer-dist 是默认选择;强行用 VCS 只会让构建变慢、不可重现、还绕过所有缓存机制。
CI 环境里 VCS 拉取慢,大概率是没配对 Git 缓存
GitHub Actions、GitLab CI 等平台不缓存 Git 工作区,每次 git clone 都从零开始。解决方法不是调 Composer 参数,而是显式缓存 .git 目录:
- GitHub Actions 中,在
actions/checkout@v4后加一步:run: git config --global core.sparseCheckout true,再配合git sparse-checkout init减少检出体积 - 更直接的是用
actions/cache缓存整个vendor/your-vendor/private-package/.git(需先确保该路径存在),key 基于 commit hash - Docker 构建中,把
git clone提前到基础镜像层,而不是每轮RUN composer install都执行一次
VCS 模式下的“缓存”本质是 Git 缓存,不是 Composer 缓存;混淆这两者,是多数人调了半天 cache-dir 却毫无改善的根本原因。


















