应将preferred-install配置写入项目composer.json的config段而非全局,推荐使用{"acme/":"source","":"dist"}对象形式实现按包名前缀精准控制,避免ci和团队协作不一致;其为优先策略非强制开关,实际安装方式受命令行参数、包自身声明等多重因素影响。

preferred-install 应该写在项目 composer.json 的 config 段里
它不是命令行开关,也不是环境变量,改完保存就生效,下次 composer install 或 composer update 就会按新规则拉包。别去动 ~/.composer/config.json —— 全局配置容易让 CI、同事、Docker 构建行为不一致,尤其当你用 Laravel 或 Symfony 这类标准项目时,vendor 里混进一堆 .git 目录就很难受。
直接在项目根目录的 composer.json 文件里加这段:
{
"config": {
"preferred-install": "dist"
}
}
如果只想对自家包走 source(比如 acme/*),而第三方包仍用 dist,就写成对象形式:
{
"config": {
"preferred-install": {
"acme/*": "source",
"*": "dist"
}
}
}
国内镜像源要单独配,和 preferred-install 无关
preferred-install 控制“怎么装”,镜像源控制“从哪下”,两者独立。设了 "preferred-install": "dist" 后,如果镜像源没同步某个包的 dist 资源(比如某些私有包、dev 分支、或阿里云/腾讯云镜像漏同步),就会报 Failed to download xxx: file could not be downloaded (HTTP 404)。
确认当前镜像源:
composer config repo.packagist.org.url
切清华源(推荐,同步及时):
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
composer config -g repo.packagist.org.url https://packagist.phpcomposer.com
或者更稳妥地,在项目级禁用默认源、显式声明镜像:
{
"repositories": [
{
"type": "composer",
"url": "https://packagist.phpcomposer.com"
},
{
"packagist": false
}
]
}
为什么设了 dist 还 clone 了 git?三个常见原因
- 命令行加了
--prefer-source或--prefer-dist—— 它们优先级高于preferred-install,会直接覆盖配置 - 包自身
composer.json里没声明"dist"字段(比如私有 GitLab 仓库没启用 archive 功能),Composer 只能 fallback 到 source -
vendor/和composer.lock没清干净 —— Composer 会复用已有缓存,不会重新判断安装方式
验证配置是否真生效:删掉 vendor/ 和 composer.lock,再跑 composer install。
dist 和 source 的实际影响远不止快慢
选 dist 不只是省时间,它意味着你拿到的是打包好的 zip/tar,没 .git、不能 git checkout、也不能直接改 vendor 里的代码;source 则带完整 Git 历史,适合调试 fork 的包或正在协作开发的内部库。
但注意:preferred-install 是“优先尝试”,不是强制锁定。即使设成 "source",如果包没提供 "source": {} 字段,Composer 依然会 fallback —— 所以最终行为得看包元数据 + 网络可用性 + 命令行参数三者叠加。
最容易被忽略的一点:私有 VCS 包(比如自建 GitLab)默认不走 dist,哪怕你写了 "preferred-install": "dist",也得在包自己的 composer.json 里手动补上 "dist": { "url": "...", "reference": "..." },否则照样 clone。










