preferred-install 是 Composer 配置项,决定包以 dist(压缩包)或 vcs(Git 克隆)方式安装,默认 auto 易导致 vendor 混合两种形态,影响调试与构建;需显式设为 dist/vcs 并清 vendor 重装才生效。

preferred-install 是什么,为什么会影响你的 vendor 目录
preferred-install 是 Composer 的全局或项目级配置项,它不控制“要不要安装”,而是决定 包以哪种源形式被拉取:是 dist(压缩包,快、省流量)还是 vcs(Git 克隆,带完整历史,适合开发调试)。默认值是 auto,即 Composer 自行判断——但这个“自动”常导致你本地 vendor 里混着两种形态,给调试、打包、CI 构建带来隐性麻烦。
怎么设置 preferred-install:全局 vs 项目级
设置位置不同,作用范围就不同。别只改一个地方然后怀疑没生效。
- 全局配置(影响所有项目):
composer config -g preferred-install dist
- 当前项目配置(仅影响本项目
composer.json所在目录):composer config preferred-install vcs
- 显式写进
composer.json(推荐用于团队协作):"config": { "preferred-install": "dist" }
注意:composer config 命令修改的是 composer.json 或 ~/.composer/config.json,不是 composer.lock;改完后下次 composer install 或 composer update 才会按新规则拉取——已存在的包不会自动重装,得先删 vendor 再重装。
dist 和 vcs 的实际差异,不只是“快慢”那么简单
选 dist 还是 vcs,关键看你要做什么:
-
dist:下载 ZIP/TAR 包,解压即用;无 Git 目录,不能git status或git checkout;适合生产环境、CI/CD、Docker 构建 -
vcs:执行git clone,保留完整仓库;可切分支、查提交、打 patch;但首次安装慢、占磁盘、可能因网络或权限失败 - 设成
auto时,Composer 对 Packagist 上的稳定版倾向dist,对dev-分支或"minimum-stability": "dev"的包倾向vcs
常见误操作:在 CI 脚本里设了 vcs,结果因私有 Git 服务器认证失败而卡住;或者本地开发设了 dist,想临时改依赖源码却找不到 .git 目录。
如何验证 preferred-install 是否生效
别光看命令输出,要检查实际文件结构:
- 运行
composer show -s vendor/package-name,看 “Source” 行是否显示git或dist - 进
vendor/vendor-name/package-name目录,执行ls -A | grep git:有.git就是vcs,没有就是dist - 如果发现部分包是
vcs、部分是dist,说明它们的type或稳定性标记不同,preferred-install只是“偏好”,不是强制;此时需检查该包的composer.json中"type"字段或版本约束(如"dev-main"会绕过dist偏好)
真正容易被忽略的是:某些包(比如用 path repository 定义的本地包)完全不走 preferred-install 逻辑——它的安装方式由 repository 类型直接决定。


















