该用--prefer-dist时:生产部署、CI/CD、不修改第三方代码,因下载预打包文件更快(快2–5倍)、更省空间(无.git)、更稳定;必须用--prefer-source时:需修改源码、切分支、打补丁或配合path仓库开发,因含完整.git目录。

什么时候该用 --prefer-dist?
生产环境部署、CI/CD 构建、日常开发中不打算改第三方代码时,直接上 --prefer-dist。它会让 Composer 优先从 Packagist 或 GitHub Releases 下载预打包的 .zip 或 .tar.gz 文件,解压即用。
- 安装快:跳过
git clone、检出、历史解析等开销,实测可比--prefer-source快 2–5 倍(尤其网络不稳定时) - 占空间小:
vendor/下没有.git目录,一个包通常省下 10–50MB - 更稳定:不依赖远程 Git 服务可用性,也不受分支重写或 force-push 影响
- 默认行为:不加任何参数时,Composer 多数情况就走 dist 路径
例如:
composer install --prefer-dist
什么时候必须用 --prefer-source?
当你需要进 vendor/ 目录改依赖源码、打补丁、切分支、查 git blame,或者本地用 path 类型仓库联动开发时,--prefer-source 是唯一选择。
- 有完整
.git目录:可git checkout dev-main测试未发布功能,也能git diff看变更 - 支持本地修改并提交:比如你正在为
monolog/monolog提 PR,就得先composer require monolog/monolog --prefer-source - 配合
"repositories": [{"type": "path", "url": "../my-local-package"}]时,若没设--prefer-source,Composer 会拒绝加载(报错:“Package is not installed as source”) - 注意:它不会自动拉最新 commit —— 克隆的是
composer.lock中锁定的 commit hash,不是main分支头
例如:
composer update monolog/monolog --prefer-source
如何避免每次敲命令?用 preferred-install 配置
在项目根目录的 composer.json 里配 "config.preferred-install",就能让偏好固化下来,不用记参数。
- 全局统一用 dist:
"config": { "preferred-install": "dist" } - 全局统一用 source(慎用,尤其团队项目):
"config": { "preferred-install": "source" } - 按包精准控制(推荐):
"config": { "preferred-install": { "myorg/*": "source", "*": "dist" } }这样自家私有包走 source,所有第三方仍走 dist
⚠️ 注意:preferred-install 的匹配是字符串前缀匹配,不是 glob 或正则;"*" 是通配符,但只认包名开头,不能写成 "*/monolog"。
常见误判和坑点
很多人以为 --prefer-source = “能拿到最新代码”,其实不是 —— 它克隆的是 composer.lock 里记录的 commit,和 --prefer-dist 拿到的代码完全一致,只是多了 .git。想更新,得 composer update 或手动 git pull。
-
--prefer-source不等于--dev:前者管“怎么装”,后者管“装不装require-dev”,两者完全正交 - 某些私有 Git 仓库(如自建 Gitea)若未配置
dist包 URL,--prefer-dist会失败并静默 fallback 到 source —— 看似成功,实则违背预期 - CI 环境里用了
--prefer-source却没清理vendor/,可能因残留.git导致后续git status报错或缓存污染
真正关键的判断点只有一个:你是不是要进 vendor/xxx 里改代码。要改,就 source;只用,就 dist —— 别被“最新”“最全”这种词带偏。










