composer查包是严格从repositories数组首个元素开始线性匹配,首个声明支持目标包的仓库即生效,后续全跳过;必须用索引数组、私有源置顶、显式设{"packagist.org": false}于其后,且私有源packages.json须含完整元数据。

composer 查包不是“智能选源”,而是从 repositories 数组第一个元素开始,逐个检查是否声明支持你要的包——只要某个仓库的 packages.json 里有该 vendor/package 的元数据(哪怕只有 dev-main),就立刻采用,后续所有仓库全跳过。
这个行为在 Composer 2.x 是硬性短路逻辑,不 fallback、不合并、不提示冲突。配错顺序或漏关默认源,包就会从错误地方拉,甚至静默失败。
为什么改了 repositories 顺序却没走私有源?
根本原因只有两个:"packagist.org": false 缺失,或私有源的 packages.json 根本没声明你要的包名。
- 没加
"packagist.org": false:Composer 会隐式把官方源当兜底,无论你把私有源写在第几行,它都会先查https://packagist.org/packages/list.json或镜像地址——日志里完全看不到你的私有 URL -
"packagist.org": false写错位置:它必须是repositories数组里的一个独立对象,且放在私有源之后(不是之前)、数组末尾;写成{"type":"composer","url":"xxx","packagist.org":false}会被忽略 - 私有源类型选错:把 Satis 地址配成
"type": "vcs",Composer 就会尝试git clone一个 HTML 页面,报Could not find package - 私有源
packages.json不完整:比如只包含{"providers": {"myorg/utils": {}}},但没展开具体版本信息,Composer 就当它不存在
如何正确配置 repositories 数组顺序?
顺序只在禁用默认源后才生效;否则顺序无效。生效前提:所有目标包都由显式声明的仓库覆盖。
- 必须用索引数组:
"repositories": [{}, {}],不能写成键值对对象,否则只有最后一个生效 - 私有源放最前,且类型为
"type": "composer"(对应完整索引服务,如 Satis、Private Packagist) -
{"packagist.org": false}必须作为独立对象,放在私有源之后、数组末尾 - 若还需公共包(如
monolog/monolog),得手动加回官方源:{"type":"composer","url":"https://packagist.org"},并确保它在数组最后
示例有效结构:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"repositories": [
{"type":"composer","url":"https://internal.example.com"},
{"type":"composer","url":"https://partner.example.com"},
{"packagist.org": false},
{"type":"composer","url":"https://packagist.org"}
]
同名包出现在多个仓库时会发生什么?
Composer 不合并版本列表,也不提示冲突。它只取第一个“能返回元数据”的仓库结果——哪怕第二个仓库有更新的 dev-main,只要第一个没声明,composer require vendor/package:dev-main 就直接失败。
- 典型场景:A 仓只有
acme/logger:1.0.0,B 仓有2.0.0和dev-main;A 放在repositories前面 →composer update acme/logger永远卡在1.0.0 -
type: "vcs"仓库不参与版本发现阶段,只在require明确写了该 Git URL 对应的包时才触发克隆,无法靠顺序控制公共包流向 - 想让不同包走不同源?Composer 不支持 per-package 指定仓库;只能靠
only/exclude过滤规则做粗粒度分流
验证是否真正生效的关键动作
别只看 composer.json 写得对不对,要实测运行时行为。
- 运行
composer config repositories:确认输出中你的私有 URL 在最前面,且明确出现"packagist.org": false - 加
-vvv执行composer require myorg/utils:日志里必须出现类似Reading composer.json of myorg/utils和你私有 URL 的 HTTP 请求行 - 删掉
composer.lock后重跑composer install:composer install不会更新repositories配置的影响,必须重建 lock - 认证信息必须分离到
auth.json:严禁写进composer.json,否则 CI 构建可能因凭据缺失或泄露失败
最容易被忽略的是:私有源的 packages.json 是否真包含你要的包名和完整版本块;以及 {"packagist.org": false} 是否真的作为独立对象存在、位置是否正确——这两个点一错,整个优先级配置就形同虚设。










