prefer-dist 更快省空间,适合生产环境;prefer-source 带 Git 历史,便于调试和修改 vendor 代码。默认用 prefer-dist,需 patch 包时才选 prefer-source。

composer install 时 prefer-dist 和 prefer-source 到底选哪个
prefer-dist 是默认行为,Composer 优先下载压缩包(如 .zip 或 .tar.gz);prefer-source 强制从 VCS(如 Git)克隆源码。两者本质是「安装方式」而非「源类型」——别被“源”字误导,它不指 packagist.org 或私仓,而是指「包的交付形态」。
-
prefer-dist:快、省空间、适合生产环境,但无法直接改 vendor 里的代码(解压后无 .git) -
prefer-source:慢、占磁盘、带完整 Git 历史,适合要 patch 第三方包、调试进 vendor 或需要 git hooks 的场景
如果你只是部署项目或 CI 构建,prefer-dist 就够了;如果正在给某个包提 PR,或者临时 patch vendor/monolog/monolog 调试逻辑,prefer-source 才能让你 git checkout 或 git diff。
如何全局或局部设置 prefer-dist / prefer-source
设置方式分三类,优先级从高到低:命令行参数 > 项目 composer.json > 全局 config。
- 命令行临时生效(最常用):
composer install --prefer-dist
composer install --prefer-source - 项目级永久设置(写入
composer.json):"config": { "preferred-install": "dist" }值可为"dist"、"source"或{"*": "dist", "myorg/*": "source"}(按包名 pattern 匹配) - 全局配置(影响所有项目):
composer config --global preferred-install dist
注意:preferred-install 配置只对新安装生效;已存在的 vendor 目录不会自动重装,得先 rm -rf vendor && composer install。
为什么有时 --prefer-source 不起作用
不是所有包都支持 source 安装,常见失效原因:
- 包在
composer.json中声明了"dist"但没写"source"(比如只提供 zip 下载,没填"url"和"reference"字段) - 私有 Git 仓库未正确配置
repositories,或 SSH 权限不足导致 clone 失败(错误如Failed to execute git clone --no-checkout) - 使用了
platform或package类型仓库,这类仓库不走 VCS,--prefer-source被忽略 - Composer 版本太老(
验证是否真走 source:安装后进 vendor/some/package,执行 ls -A | grep git —— 有 .git 目录才算成功。
dist 和 source 对 autoload、autoload-dev 的影响
完全没影响。autoload 规则由包自身的 composer.json 决定,和安装方式无关。但要注意:
-
autoload-dev只在composer install --dev(或无--no-dev)时才注册,无论 dist/source - 如果用
prefer-source后手动改了 vendor 里的代码,再运行composer dump-autoload,可能因 classmap 缓存导致改动不生效(建议加-o强制优化,或删vendor/composer/autoload_*.php)
真正容易被忽略的是:CI 环境里若用了 --prefer-source,却没配好 Git 凭据或没开 shallow clone,拉取几十个包的完整历史会显著拖慢构建时间。










