source装出带.git的可修改仓库,dist装出无历史的纯净PHP文件;前者支持git操作和调试,后者体积小校验稳但不可改。

source 和 dist 到底装出来啥不一样?
区别不在“能不能用”,而在“你能不能改它”。--prefer-source 装完的包里有 .git 目录,能 git log、git checkout dev-xxx、甚至临时加个 var_dump 调试;--prefer-dist 装完只有干净的 PHP 文件,没历史、没分支、不能 git pull,但体积小、解压快、校验稳。
什么时候必须用 --prefer-source?
不是“想用就用”,而是遇到这些情况才真需要:
- 你在本地开发一个私有包,并用
"repositories": {"type": "path", "url": "../my-package"}引入——不设--prefer-source或"preferred-install": {"my/package": "source"},改了源码也不会实时生效 - 要给
monolog/monolog提 PR,得切到main分支打补丁,composer require monolog/monolog:dev-main --prefer-source才能克隆完整仓库 - 某包只发布了
dev-master,没打任何 tag,Packagist 上根本没 dist 包,加了--prefer-dist也会自动 fallback 到 source
为什么 --prefer-dist 是默认,但别在开发时盲目依赖它?
因为它的“快”是有代价的:
-
composer install --prefer-dist不会覆盖已存在的 source 安装——删了vendor再装才生效,否则你以为切回 dist,其实还是老的 git 克隆体 - 某些企业镜像(比如腾讯云 TKE 镜像)只缓存 dist,你加了
--prefer-source就会绕过镜像直连 GitHub,可能被墙或超时 -
composer update时,如果新版本约束匹配某个已发布的 tag(如^2.10),即使之前是 source 安装,Composer 也可能悄悄切回 dist,导致你加的调试代码消失
怎么确认当前装的是 source 还是 dist?
别猜,直接看:
- 进
vendor/some/package,ls -a | grep git—— 有.git就是 source - 运行
composer show some/package -f=source,输出source字段为vcs表示走 Git 克隆,dist表示走压缩包 - 配置项优先级:命令行参数 > 项目
composer.json的config.preferred-install> 全局composer config --global preferred-install
最常被忽略的一点:source 和 dist 不是开关,而是“偏好”——Composer 会按包实际支持情况自动降级。你加了 --prefer-source,但对方包没配 source 地址,照样下 dist;反过来也一样。所以查 composer show 比看命令更可靠。










