本质区别在于依赖包的来源和本地存储形态不同:--prefer-dist 下载预构建压缩包,不含版本控制信息;--prefer-source 通过 Git 克隆完整源码仓库,保留 .git 目录和全部提交历史。

本质区别在于依赖包的来源和本地存储形态不同:--prefer-dist 下载的是预构建的压缩包(如 zip/tar.gz),不含版本控制信息;--prefer-source 则通过 Git 克隆完整源码仓库,保留 .git 目录和全部提交历史。
获取方式与内容差异
--prefer-dist 从 Packagist 或 GitHub Releases 等平台拉取已打包的稳定版归档文件。这些文件由维护者在打 tag 时生成,不包含开发过程中的中间提交、分支或 Git 元数据。
--prefer-source 直接执行 git clone 命令,把整个远程仓库(含所有分支、标签、.git 目录)复制到 vendor/ 目录下,等同于你在本地手动克隆该项目。
对开发和部署的实际影响
- 用 --prefer-dist:安装快、磁盘占用小、内容确定性强,适合 CI/CD 构建和线上发布
- 用 --prefer-source:能 git checkout 切换分支、git log 查看变更、git diff 对比修改,也支持直接编辑 vendor 中的代码并提交补丁
- dist 包无法更新到未发布的开发分支;source 方式可随时 git pull 获取最新提交(包括未打 tag 的改动)
- dist 安装后 vendor 目录不可 git push;source 安装后可向原仓库提 PR,前提是权限和 fork 设置正确
默认行为与配置灵活性
Composer 默认倾向 --prefer-dist,这是性能与稳定性的权衡结果。你可以在 composer.json 中精细控制:
- "preferred-install": "source" —— 全局启用源码安装
- "preferred-install": { "*": "dist", "laravel/framework": "source" } —— 大部分走 dist,仅特定包强制 source
- "preferred-install": { "dev-*": "source", "*": "dist" } —— 匹配 dev 开头的包名才走源码
不是“新旧”或“快慢”的简单二分
有人误以为 --prefer-source 能拿到“更新的代码”,其实不然:是否最新,取决于包作者是否推送了新 commit 或新 tag,跟安装方式无关。dist 包对应的是某个 tag,source 克隆的是默认分支(通常是 main 或 master),两者语义不同——一个是发布快照,一个是开发主线。










