--prefer-dist 能加快 Composer 安装,因为它跳过 git clone 和历史下载,直接解压预编译压缩包;但仅对 Packagist 上提供 dist 字段的包生效,私有仓库或未打 tag 的版本通常不支持。

为什么 --prefer-dist 能加快 Composer 安装
因为 Composer 默认在某些场景下会走 --prefer-source(克隆 Git 仓库),而源码拉取要下载完整历史、执行 git clone、再清理 .git,耗时且占磁盘;--prefer-dist 强制走预编译的压缩包(zip/tar),直接解压,跳过 Git 操作,网络和本地开销都小得多。
但注意:不是所有包都提供 dist 归档——只有 Packagist 上标记了 dist 字段(且有 GitHub/GitLab 的 release 或 zip 下载地址)的包才生效。私有仓库或未打 tag 的开发版通常不支持。
- 公共包(如
monolog/monolog)基本都支持 dist,可放心用 - 公司内网私有 GitLab 包,需确认是否配置了
dist.url或启用了archiveendpoint - 本地 path 仓库或
vcs类型仓库,--prefer-dist会被忽略
composer install 和 composer update 都能用 --prefer-dist 吗
都能用,但效果不同:
-
composer install:只按composer.lock里的记录安装,加--prefer-dist是“尽力而为”——如果 lock 文件里该包记录的是 source 方式,它不会强行改;想确保走 dist,得先删掉vendor和composer.lock,再带参数重装 -
composer update:会重新解析依赖并写入 lock,此时--prefer-dist会影响新选中的包版本是否优先选 dist 归档 - 更稳妥的做法是把偏好写进配置:
composer config --global prefer-stable true && composer config --global prefer-dist true,全局生效
常见错误:明明加了 --prefer-dist,还是看到 Cloning xxx
说明 Composer 实际没走 dist 流程,典型原因有:
- 包本身没提供 dist 下载地址(比如 dev-master 分支、未打 release tag)
- 你正在使用
repositories自定义源,但该源没返回dist字段(检查 API 返回 JSON 里有没有dist键) - 网络拦截或 CDN 缓存导致 redirect 失败,最终 fallback 到 source(可加
-v看详细日志,搜Downloading或Cloning) - PHP cURL 扩展不支持 HTTPS redirect,或 OpenSSL 版本太旧,导致 zip 下载失败后自动降级
验证是否真走了 dist:安装时加 -v,看到类似 Downloading https://api.github.com/repos/xxx/yyy/zipball/abc123 就对了;如果看到 Cloning https://github.com/xxx/yyy.git,那就没成功。
性能差异有多大?什么时候值得开
单包节省几秒到十几秒不等,但项目依赖多时(比如 Laravel + 50+ 包),总时间可能差 1–3 分钟,尤其在 CI/CD 或低带宽环境(如海外服务器拉国内镜像慢)下感知明显。
不过要注意副作用:
- dist 包不含 Git 历史,无法用
git status查看修改,调试时不能直接git diff - 某些包的
post-install-cmd脚本依赖 .git 目录(少见但存在),dist 下会报错 - 如果你习惯在
vendor里临时改代码调试,dist 解压后文件权限可能更严格(比如不可写),不如 source 灵活
所以日常开发可以关掉,CI 构建、部署脚本、新机器初始化这些“只读安装”场景,--prefer-dist 是默认该开的。











