Composer 默认优先使用 --prefer-dist,通过 HTTP(S) 下载预构建压缩包而非 git clone;仅当包无发布版本、显式配置 source、本地已存在 source 模式或强制指定 --prefer-source 时才回退到 --prefer-source。

composer install 和 update 默认走什么下载方式
Composer 默认优先使用 --prefer-dist,只要包的 dist 信息(如 zip 包 URL、SHA256 校验值)在 composer.lock 或仓库元数据中存在,就会跳过 git clone,直接下载预构建的压缩包。这比 --prefer-source 快得多,尤其对含大量历史提交或大二进制资源的包。
什么时候必须用 --prefer-source
以下情况会绕过 dist、强制走 source(即 git clone):
- 包未发布正式版本(只有
dev-*分支,无dist描述) -
composer.json中显式配置了"source": { ... }且无对应dist - 本地已存在
vendor/xxx且是 source 模式,而 lock 文件未更新,Composer 会复用源码目录而非重下 dist - 运行
composer install --prefer-source或设置了环境变量COMPOSER_PREFER_SOURCE=1
HTTP vs HTTPS vs Git 协议对 dist 下载的影响
dist 下载本身不走 Git 协议,只依赖 HTTP(S) —— Composer 从 Packagist 或私仓获取 dist.url 后,用 PHP 的 file_get_contents 或 cURL 下载 ZIP/TAR。关键差异在于:
-
https://URL:最常见,支持 CDN 加速、校验完整,但部分企业网络可能拦截或限速 -
http://URL:极少见(Packagist 已禁用),无加密,易被中间人篡改,不推荐 - Git 协议(如
git@github.com:...):只用于--prefer-source,与 dist 无关;若误配在dist.url字段会导致下载失败并报错Failed to download xxx: Invalid URL format
可通过 composer show -s vendor/package 查看当前包实际使用的 dist URL 协议。
如何确认某次安装是否真的用了 --prefer-dist
加 -v 参数观察输出,成功走 dist 时会出现类似行:
Downloading https://api.github.com/repos/symfony/console/zipball/refs/tags/v6.4.7 Writing /path/to/vendor/symfony/console/9a8b7c2.zip into cache
若看到 Cloning 或 git@github.com:...Executing command (CWD): git clone --no-checkout,说明 fallback 到了 source 模式。
更可靠的方式是检查 vendor 目录结构:--prefer-dist 解压后无 .git 目录;--prefer-source 则保留完整 Git 仓库。
dist 能加速下载,但前提是 packagist.org 或私仓能提供稳定、低延迟的 ZIP 镜像服务;如果遇到反复超时,别只盯着参数,先查 dist.url 是否可直连、是否被墙、是否指向了失效的 GitHub Releases 地址。










