应使用项目级配置而非全局配置,即在项目根目录composer.json的config段中添加"preferred-install": "dist",避免全局设置导致团队协作和ci构建不一致;其值为策略提示而非强制开关,实际安装方式还受命令行参数、包自身声明等多重因素影响。

composer config -g preferred-install 是全局配置,但不推荐用
全局设置 preferred-install 会作用于你本地所有新项目,看似省事,实则埋雷。它写进 ~/.composer/config.json(或新版的 COMPOSER_HOME/config.json),一旦设成 "source",后续新建 Laravel 项目、跑 CI 脚本、甚至同事拉代码后执行 composer install,都会默默 clone 所有包——包括 monolog/monolog 这种纯 dist 包,只要它没显式声明 "dist" 字段,就可能 fallback 到 source,导致构建变慢、失败或 vendor 多出一堆 .git 目录。
真正该做的,是把配置收束到项目里。删掉全局设置:
composer config -g --unset preferred-install
然后在项目根目录 composer.json 的 config 段里加:
"config": {
"preferred-install": "dist"
}
这样团队成员、CI、Docker 构建都按统一规则来,不会因某人本地全局配置不同而行为分裂。
preferred-install 设成 "dist" 或 "source" 时,实际会发生什么
这个值不是开关,而是“优先尝试”的策略。Composer 最终装什么,取决于命令行参数、包自身声明、网络可用性三者叠加。
-
"dist":先查包有没有"dist": {"url": "...", "type": "zip"},有就下压缩包;没有就静默 fallback 到source(比如私有 GitLab 仓库没启用 archive 功能) -
"source":一律执行git clone,哪怕装的是v4.2.0这种稳定 tag,首次安装耗时明显增加,CI 容易卡在Cloning into 'vendor/acme/utils'... - 对象形式最实用:
{"acme/*": "source", "*": "dist"},只对自家命名空间走源码,第三方包全走 dist,兼顾调试与构建稳定性
注意:"*" 是前缀匹配,不是 glob;"myorg/monolog" 不会匹配 "monolog/monolog",也不能写成 "*/monolog"。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么 vendor 里有的包是 dist、有的却是 source?光看 preferred-install 不够
你改完 composer.json 里的 preferred-install,运行 composer install,发现部分包还是 source,别急着怀疑配置失效。真实决定因素有四个,优先级从高到低:
- 命令行是否带
--prefer-dist或--prefer-source(最高,临时覆盖一切) - 项目
composer.json中的config.preferred-install - 包自身
composer.json是否定义了"dist"或"source"字段(私有包常缺失) - 是否在
require-dev里,且当前执行composer install --no-dev(dev-only 包可能被跳过或降级策略)
已安装的包不会自动重装。想让旧包也按新策略来,得先删掉 vendor 和 composer.lock,再跑 composer install。
CI 和 Docker 环境里 preferred-install 配错的典型表现
CI 构建失败、Docker 镜像体积暴涨、本地开发和线上行为不一致——这些问题八成跟 preferred-install 配错有关。
- 配成
"source"且私有 Git 服务不可达 → 构建卡死在git clone,报错类似fatal: Could not read from remote repository. - 配成
"dist"但私有包没提供 archive → vendor 里仍出现.git,镜像多出几十 MB,还可能泄露内部 commit hash - 用了全局配置,但 CI runner 没同步该配置 → 构建用默认
auto,结果和本地不一致
最稳的做法:项目级配置 + 显式指定 --prefer-dist 在 CI 脚本里,双重保险。别依赖“应该会 fallback”,生产环境要确定性。










