如何在Composer中使用–prefer-source下载完整源码?(调试必备)

4次阅读

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

如何在Composer中使用–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 构建变慢、占用更多磁盘空间,且某些私有仓库若没配好 sshTokengit clone 会直接失败并中断安装。

调试时发现源码没更新?检查 Git 分支和提交点

Composer 拉的源码是按 composer.lock 里记录的 source 字段来的,通常是某个 commit hash,不是 maindev-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 清空干净,否则状态极易错乱。

text=ZqhQzanResources