--prefer-source仅用于需直接修改vendor代码的场景,如本地调试、紧急修bug或依赖git元信息,而非标准安装;它会拖慢CI、增大磁盘占用,且不保证生效(包无source字段时静默回退dist)。

加 --prefer-source 不是为了“装得更标准”,而是为了能直接改 vendor 里的代码——但多数时候你并不需要它,强行加反而拖慢 CI、撑爆磁盘、引发权限问题。
什么时候必须用 --prefer-source
只有当你需要在 vendor 目录里直接编辑、调试、打 patch、甚至提交修改时,才真正需要它。典型场景包括:
- 正在为某个包修一个紧急 bug,想先本地验证再提 PR,而该包没提供可 fork + require-path 的开发模式
- 你在调试 Laravel 或 Symfony 某个底层行为,需要打断点、加日志、临时注释某行 ——
dist安装后没有.git,改了也没法git diff或git checkout - 团队内部维护一个私有组件,CI 要跑单元测试并收集覆盖率,而测试脚本依赖
git describe或composer install --no-dev后仍需读取 Git 元信息(比如生成版本号)
--prefer-source 和 preferred-install 配置的区别在哪
命令行参数 --prefer-source 是临时开关,只对当次命令生效;而 preferred-install 是配置项,影响后续所有 install/update。关键差异在于:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer install --prefer-source会覆盖composer.json里"preferred-install": "dist"的设置,但不会写回配置文件 -
"preferred-install": {"myorg/*": "source", "*": "dist"}这种写法支持按命名空间精准控制,比全局加参数更安全 —— 不会把monolog/monolog也拉成 Git 仓库 - 如果包本身没配
source地址(例如私有 GitLab 仓库没启用 archive 功能),即使加了--prefer-source,Composer 也会静默 fallback 到dist,不报错也不提醒
加了 --prefer-source 却没看到 .git 目录?常见原因
不是参数失效,而是 Composer 在特定条件下会跳过克隆。排查顺序如下:
- 检查该包的
composer.json是否定义了"source"类型的仓库("type": "vcs"且含"url");若只有"dist"字段,--prefer-source无效 - 运行
composer show vendor/package-name,看输出中source行是否为空或显示not available - 确认你没在环境变量里设
COMPOSER_PREFER_DIST=1,它优先级高于命令行参数 - 已存在
vendor/vendor/package-name且是dist方式安装的,composer install --prefer-source默认跳过重装 —— 必须先删目录或加--force-reinstall
为什么 CI 环境里要慎用 --prefer-source
它会让构建变得脆弱且缓慢,尤其在以下情况:
- 私有 Git 服务器响应慢或偶发超时(
process-timeout默认 300 秒,但 clone 大仓库常超时) - CI 节点没配 SSH key 或没开 HTTPS 认证,
git clone直接失败,错误信息可能是Cloning into '...' ... fatal: could not read Username - 同一份
composer.lock在本地用--prefer-source装过,CI 再跑composer install(无参数)时,Composer 会沿用 lock 文件里记录的 source 方式,导致构建环境不一致 -
vendor目录体积可能翻 3–5 倍(比如symfony/symfonydist 约 8MB,source 含完整历史可达 40MB+),拉取和缓存都变重
真正需要改 vendor 代码时,优先考虑 path repository 或 fork + require dev 分支,而不是依赖 --prefer-source。后者只是兜底手段,不是开发常态。

















