preferred-install必须写在项目根目录composer.json的config对象里才真正生效,命令行参数和环境变量无效;改完无需重启,下次composer install/update即生效,且项目级配置会覆盖全局配置。

preferred-install写在哪儿才真正起效
必须写进项目根目录的 composer.json 的 config 对象里,不是命令行参数,也不是环境变量。改完不用重启、不用 reload,下次 composer install 或 composer update 就自动生效。
常见错误是去动 ~/.composer/config.json(旧路径)或狂用 composer config -g,结果团队成员行为不一致——因为项目级配置会直接覆盖全局配置。优先级链条很明确:--prefer-dist/--prefer-source 命令行参数 > 项目 composer.json 里的 preferred-install > 全局 config > Composer 默认 auto。
- 项目级(推荐):在
composer.json中加"preferred-install": "dist" - 全局(慎用):运行
composer config -g preferred-install dist,会影响所有后续项目 - 临时覆盖:比如调试时跑
composer install --prefer-source,它比任何配置都高
值设成"dist"、"source"还是对象?各有什么实际后果
preferred-install 不是开关,而是策略映射,支持三种形式,影响范围和灵活性差异很大:
-
"dist":强制所有包走压缩包下载(zip/tar),但若某包没提供dist字段(比如私有 GitLab 仓库未启用 archive 功能),Composer 会静默 fallback 到source -
"source":一律git clone,哪怕装的是v3.2.1这种稳定 tag,首次耗时明显变长,CI 环境容易因网络或权限失败 - 对象形式(最实用):
{"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不够
实际安装方式是多个因素叠加的结果,preferred-install 只是其中一环。真正决定最终行为的优先级链条是:
- 命令行是否带
--prefer-dist或--prefer-source(最高) - 项目
composer.json的preferred-install配置 - 包自身
composer.json是否声明了dist或source字段(例如私有包若没"source": {},即使你设"source"也 fallback) - 是否在
require-dev里、是否启用了--no-dev(dev-only 包可能被跳过或降级策略)
典型现象:执行 composer install 后,vendor/symfony/console 没 .git,但 vendor/my/internal-lib 有 —— 很可能是因为后者在 repositories 里定义为 type: vcs,且 preferred-install 里匹配到了 "my/*": "source"。
验证配置是否生效的最快方法
别只看 composer install 输出日志,那容易被缓存或 fallback 掩盖。最干净的验证方式是:
- 删掉
vendor/和composer.lock - 确认没在命令里加
--prefer-dist(它会覆盖配置) - 运行
composer install - 检查目标包目录下是否存在
.git:有 = source,无 = dist(注意 Composer 5.0+ 默认会在 source 安装后执行git clean -xdfq并删掉.git,如需保留得额外配"discard-changes": false)
如果发现本该走 source 的包没 .git,先查它是否真在 packagist 上注册并提供了 VCS 信息;再确认没被缓存干扰,可加 composer clear-cache 后重试。










