绝大多数时候该用 --prefer-dist,它快、轻、稳;只有真要改 vendor 里的代码时,才必须用 --prefer-source。--prefer-dist 优先下载校验可靠的预打包压缩包,无需 Git;--prefer-source 则强依赖 git 命令、网络连通性及认证,CI 中卡在 Cloning 往往因构建机缺 Git 或配置不全,且不支持 source 的包会自动降级但未必成功回退。

绝大多数时候该用 --prefer-dist,它快、轻、稳;只有真要改 vendor 里的代码时,才必须上 --prefer-source。
为什么 CI 构建卡在 Cloning into 'vendor/some/package'
大概率是误用了 --prefer-source,而构建机没装 Git、没配 SSH key,或网络屏蔽了 GitHub 的 git 端口(9418)。dist 走 HTTPS 下载,只要能访问 Packagist 或 GitHub Releases 就行;source 强依赖 git 命令可用、远程仓库可连、SSH/HTTPS 认证通过。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- CI 镜像(如
php:alpine)默认不带 Git,apt-get install git是临时补救,但不如直接切回--prefer-dist - 即使加了
--prefer-source,若某包没配sourceURL(比如只发布了 zip),Composer 也会自动降级为dist—— 所以卡住 ≠ 一定成功回退 - 执行
composer show vendor/package可看出该包是否支持source:输出里要有source字段且含有效 URL,否则加参数也白搭
preferred-install 配置写错就全项目翻车
全局设 "preferred-install": "source" 是高危操作,尤其团队协作时:所有人本地 vendor 都多出几十 MB .git 目录,CI 构建变慢,还可能因 Git 配置不一致报错。
- 推荐写法:
"myorg/*": "source"(自家私有包可调试) +"*": "dist"(第三方一律压缩包) - 通配符
*必须放最后,否则"*": "dist"写在前面会覆盖掉所有自定义规则 - 匹配是「包名前缀」,不是 glob:
"monolog"不匹配monolog/monolog,必须写成"monolog/"或"monolog/*" - 配置生效需重跑
composer install或composer update,已有vendor不会自动重装
--prefer-source 后你进 vendor 能 git checkout,但下次 update 默认不会保留你的修改
这是最容易被忽略的点:source 安装后,你确实可以 git commit 本地 patch,但 composer update 会按 composer.lock 中锁定的 commit hash 重新检出 —— 除非你手动 git push 到自己的 fork 并改 repositories,否则你的提交会被覆盖。
- 配合
"repositories": [{"type": "path", "url": "../my-local-package"}]时,--prefer-source是刚需,否则报错:Package is not installed as source -
dist对应的是某个稳定 tag(如v3.5.0),source克隆的是默认分支(如main),两者语义不同,不是“新旧”关系 - 小众包或私有包常只提供
dist,因为作者没在composer.json里配sourceURL;GitHub 仓库若未打 tag,Packagist 可能只索引到dist(Release ZIP),而source信息为空

















