--prefer-dist 生效需包提供 dist,否则 fallback 到 git clone;验证看 composer show -s 输出是否有 dist.url,无则说明无预构建包。

为什么加了 --prefer-dist 还在 clone git?
这不是参数失效,而是 Composer 没得选——它只在包「有 dist」时才走 --prefer-dist。一旦某个包没提供预构建压缩包(比如私有 GitLab 项目没开 archive、或用了 "type": "git" 却漏配 "dist" 字段),哪怕你加了参数,它也会默默 fallback 到 git clone。
- 查证方式:
composer show -s vendor/package,看输出里有没有dist.url;为空或显示type: git,说明没 dist -
composer.lock里已记录为 source 安装?那install就复用旧方式,删掉lock和vendor/再试 - 用了自定义
repositories?必须确保每个包的dist.url可直连、协议是https://,不能是git@或http://
怎么让 --prefer-dist 真正生效且稳定?
光加参数不够,得配合环境和配置一起“堵死 source 路径”:
- 全局设默认:
composer config -g preferred-install dist(推荐 CI 脚本里显式写composer install --prefer-dist --no-dev --optimize-autoloader) - 国内镜像必须配好:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,否则 dist URL 指向 GitHub Releases,大概率被墙或超时 - 禁用干扰项:加
--no-scripts --no-interaction,避免脚本执行卡住或交互中断 - 验证是否真走 dist:
ls vendor/some-package/.git—— 没这个目录,才是成功;-v输出里看到Downloading https://...而非Cloning git@...
哪些情况不该硬上 --prefer-dist?
它不是万能加速键,强行用反而报错或白忙活:
- 依赖里混了
"dev-main"、"dev-feature/x"这类开发分支 —— 它们通常不发 dist,--prefer-dist直接失败 - 本地用
"type": "path"做联动开发 —— 这种天生就是 source 模式,参数无效 - 设置了
COMPOSER_PREFER_SOURCE=1环境变量 —— 它会强制覆盖所有--prefer-dist和配置 - CI 中用了
composer update却没加--prefer-dist?别指望它自动生效——update默认虽倾向 dist,但若 lock 里存的是 source hash,仍会沿用
比调参数更关键的三件事
很多人盯着 --prefer-dist 狂调,却忽略真正卡顿的根源:
- 镜像源没切国内?
composer config -g repo.packagist输出还是https://packagist.org?那所有优化都白搭 - 并行下载没开?Composer 2.0+ 默认开,但并发数太低(默认 4)或太高(>8)都容易触发限流或 I/O 阻塞,建议先设
composer config -g parallel-downloads 6 - 缓存目录挂错了?
COMPOSER_CACHE_DIR指向机械硬盘或网络存储,解压 ZIP 时磁盘成瓶颈,速度反不如串行
最稳的生产部署流程:有网环境下先跑一次 composer install --prefer-dist --no-dev,确认 vendor/ 下无任何 .git,再把 composer.lock 和缓存打包带走 —— 其他地方就只是解压,不碰网络也不碰 git。










