--prefer-source 仅在首次安装或 composer update 时生效;已用 --prefer-dist 安装的包,再次运行 composer install --prefer-source 不会重拉源码,需删 vendor 或执行 composer update xxx --prefer-source。

为什么 --prefer-source 有时不生效?
它只在包首次安装、或 composer update 时起作用;如果包已用 --prefer-dist(默认)装好,再次运行 composer install --prefer-source 不会重拉源码——Composer 认为“已存在”就跳过。必须先删掉 vendor/xxx 目录,或执行 composer update xxx --prefer-source 强制刷新。
composer.json 里怎么全局启用源码模式?
在根目录 composer.json 的顶层加 "config" 段,写死 "preferred-install":
{
"config": {
"preferred-install": {
"*": "source"
}
}
}
这样所有新装包都走 Git 克隆;但注意:这会让 CI 构建变慢、占用更多磁盘空间,且某些私有仓库若没配好 SSH 或 Token,git clone 会直接失败并中断安装。
调试时发现源码没更新?检查 Git 分支和提交点
Composer 拉的源码是按 composer.lock 里记录的 source 字段来的,通常是某个 commit hash,不是 main 或 dev-master。所以即使你本地改了 vendor 里的代码,下次 composer update 还会重置回那个固定 commit。
- 想长期改某包?用
composer config repositories.xxx path ./local/package指向本地副本 - 临时打补丁?改完后运行
git add -f vendor/xxx && git commit -m "wip"避免被覆盖 - 确认当前状态:进
vendor/xxx目录,执行git log -n 1看实际 commit
和 --prefer-dist 混用时的陷阱
同一个项目里,不能对部分包用 --prefer-source、另一些用 --prefer-dist——Composer 不支持 per-package 偏好设置(除非用自定义仓库类型)。常见误操作:
- 执行
composer require foo/bar --prefer-source && composer require baz/qux --prefer-dist→ 后者会被忽略,全按前一次偏好走 - CI 脚本里先
install --prefer-dist,再update foo --prefer-source→ foo 会换源码,但其他包仍保持 dist 归档,可能导致 autoloader 不一致
真要混合,只能分两次独立安装,且确保 vendor 清空干净,否则状态极易错乱。










