应优先使用 --prefer-dist,仅调试私有包时才用 --prefer-source;ci 中卡在 cloning 通常因误用 --prefer-source 且构建机缺 git 或网络限制;dist 走 https 下载,source 强依赖 git 环境与认证。

绝大多数时候该用 --prefer-dist,它快、轻、稳;只有真要改 vendor 里的代码时,才必须上 --prefer-source。
为什么 composer install 在 CI 里卡在 Cloning into 'vendor/some/package'
大概率是误用了 --prefer-source,而构建机没装 Git、没配 SSH key,或网络屏蔽了 GitHub 的 git 端口(9418)。
- dist 包走 HTTPS 下载,只要能访问 Packagist 或 GitHub Releases 就行
- source 模式强依赖
git命令可用、远程仓库可连、SSH/HTTPS 认证通过 - CI 镜像(如
php:alpine)默认不带 Git,apt-get install git是临时补救,但不如直接切回--prefer-dist - 即使加了
--prefer-source,若某包没配sourceURL(比如只发布了 zip),Composer 也会自动降级为 dist —— 所以卡住 ≠ 一定成功回退
preferred-install 配置写错就全项目翻车
全局设 "preferred-install": "source" 是高危操作,尤其团队协作时:所有人本地 vendor 都多出几十 MB .git 目录,CI 构建也变慢,还可能因 Git 配置不一致报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐按前缀精准控制:
"myorg/*": "source"(自家私有包可调试)+"*": "dist"(第三方一律压缩包) - 通配符
*必须放最后,否则"*": "dist"写在前面会覆盖掉所有自定义规则 - 匹配是「包名前缀」,不是 glob:
"monolog"不匹配monolog/monolog,必须写成"monolog/"或"monolog/*" - 配置生效需重跑
composer install或composer update,已有 vendor 不会自动重装
composer show vendor/package 能看出到底支持哪种安装方式
执行后看输出里的 source 和 dist 字段是否都有 URL。没有 source 地址的包,加 --prefer-source 也没用,必然 fallback 到 dist。
- 常见情况:小众包或私有包只提供 dist,因为作者没在
composer.json里配sourceURL - GitHub 仓库若未打 tag,Packagist 可能只索引到 dist(Release ZIP),而 source 信息为空
-
dist对应的是某个稳定 tag(如v3.5.0),source克隆的是默认分支(如main),两者语义不同,不是“新旧”关系
真正容易被忽略的点是:source 安装后,你进 vendor/some/package 能 git checkout,但下次 composer update 默认不会保留你的修改——除非你手动 git commit 并确保没被 composer.lock 锁死 hash。而 dist 安装压根没 .git,连这个机会都没有。










