项目级 composer.json 的 preferred-install 配置优先级高于全局,命令行参数最高;应删除全局设置,仅在 composer.json 的 config 段定义,支持通配符匹配,且仅影响首次安装与 update 时的重拉行为。

项目级 composer.json 中的 preferred-install 配置会直接覆盖全局设置,且命令行参数(如 --prefer-dist)优先级最高 —— 这是唯一可靠、可协作、可 CI 复现的控制方式。
为什么全局 config -g preferred-install 几乎总是错的
全局配置写入 ~/.composer/config.json 或 $COMPOSER_HOME/config.json,一旦设为 "source",所有新项目(包括同事拉取的 Laravel 项目、CI 构建脚本)都会默认 clone 所有包。哪怕 monolog/monolog 明明只提供 dist,只要它没显式声明 "dist" 字段,Composer 就可能 fallback 到 source,导致:
- vendor 目录多出几百 MB 的
.git文件夹 - CI 构建因 Git 权限或网络超时失败
- 团队成员本地行为不一致(有人全局设了 source,有人没设)
真正该做的是删掉它:composer config -g --unset preferred-install,然后收束到项目里。
项目级 config 必须写在 composer.json 的 config 段里才生效
preferred-install 不接受命令行参数或环境变量注入,也不从 auth.json 或其他位置读取。它只认 composer.json 根对象下的 "config" 字段。写错位置(比如塞进 "scripts" 或顶层)等于没写。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确写法:
"config": { "preferred-install": "dist" } - 错误写法:
"preferred-install": "dist"(不在config对象内) - 更灵活的写法(按命名空间区分):
"config": { "preferred-install": { "myorg/*": "source", "*": "dist" } }注意匹配顺序:myorg/*先命中,myorg/utils就不会被*捕获
命令行参数比 config 高一级,但仅对单次命令有效
--prefer-dist 和 --prefer-source 的优先级高于任何 config 设置,包括项目级。它们适合临时调试或 CI 强制策略,但不能替代 config 的长期约定。
-
composer install --prefer-dist:无视preferred-install值,强制走 dist -
composer require myorg/debug-helper --prefer-source:只对该包生效,不影响其他新包 - ⚠️ 注意:
composer update会重新应用当前preferred-install策略,不是“保留上次安装方式”——之前用 source 装的包,改 config 为 dist 后 update,会删整个目录重下 zip
通配符匹配和 fallback 行为容易被低估
preferred-install 是“优先尝试”,不是硬开关。即使设为 "dist",只要包的 composer.json 没声明 "dist" 字段,或者 dist URL 不可用(如私有 GitLab 未启用 archive),Composer 就会静默 fallback 到 source。
- 私有包若托管在 GitLab,需确认其
packages.json中每个版本都含"dist": {"url": "...", "type": "zip"},否则"preferred-install": "dist"形同虚设 - 通配符
"dev-*"有效,适合仅对开发版包启用 source:"dev-*": "source" - 不要混用冲突规则,例如:
"myorg/*": "source"和"myorg/utils": "dist"—— 后者永远不会触发
最常被忽略的一点:这个配置只影响 composer require 和首次 composer install,对已安装包的 composer update 会全量重拉,不是增量切换。

















