composer仓库优先级由repositories数组顺序与"packagist.org": false共同决定:未禁用默认源时官方源兜底、顺序无效;禁用后严格按数组从上到下匹配,首个返回元数据的仓库生效,后续忽略。

Composer 仓库优先级不是靠“设置”出来的,而是由 repositories 数组顺序 + "packagist.org": false 开关共同硬性决定的:顺序只在禁用默认源后才真正生效;否则官方源永远兜底,你写的顺序根本不起作用。
为什么改了 repositories 顺序却没走私有源
常见现象是私有包仍从 packagist.org 安装,哪怕你把私有仓库写在 repositories 第一位。根本原因只有两个:
- 没显式禁用默认源:
"packagist.org": false缺失或位置错误(它必须是repositories数组里的一个独立对象,不能嵌套进其他仓库) - 私有源的
packages.json根本没声明你要的包——Composer 不会“尝试拉取”,只查元数据是否匹配;查不到就跳过,不报错也不提示 - 项目级
composer.json中定义了repositories,但你只改了全局~/.composer/config.json,后者被完全忽略
验证方式:运行 composer config repositories,确认输出里没有 https://repo.packagist.org,且你的私有 URL 在最前面;再加 -vvv 跑一次 composer update vendor/package,看日志里是否出现该 URL 的 Reading composer.json of ... 行。
"packagist.org": false 必须单独成项、位置严格
这个开关不是配置项,而是一个特殊仓库占位符,语义是“从此关闭隐式兜底”。它必须满足三个条件:
- 是
repositories数组中的一个独立 JSON 对象,不能合并进其他仓库(比如不能写成{"type":"composer","url":"xxx","packagist.org":false}) - 必须放在私有源之后、数组末尾(顺序错了会直接导致私有源被跳过)
- 键名必须是
"packagist.org",不是"packagist"或"packagist.com";大小写和点号都不能错
正确结构示例:
"repositories": [
{
"type": "composer",
"url": "https://pkgs.internal"
},
{
"packagist.org": false
}
]
如果误写成 "packagist": false,Composer 会静默忽略,继续走官方源。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
多个镜像或私有源共存时,404 和超时行为完全不同
Composer 对不同错误的处理逻辑差异极大,直接影响“优先级”是否真能 fallback:
- 遇到 404(包不存在),会立刻查下一个源
- 遇到 DNS 失败、连接超时(默认 30 秒)、HTTP 500,直接中断命令,后续源完全不触发
- 私有源返回 403 或 401 时,默认静默跳过——你以为它“失效了”,其实只是被绕过去了,容易误判配置成功
所以把阿里云镜像放第一位有意义,但把阿里云 + 腾讯云都写进去没意义:只要第一个响应正常,第二个永远不会被访问。生产环境建议只配一个主力镜像 + "packagist.org": false,而不是堆砌多个“以防万一”。
type: "vcs" 仓库不参与优先级竞争
如果你用 type: "vcs"(如 Git 仓库)配私有包,它根本不进 repositories 的线性匹配流程:
- 它只在
require中明确写了该仓库地址对应的包名时,才会被临时解析 - 它不提供
packages.json,无法参与全局元数据合并,也就谈不上“优先级” - 想让它生效,必须在
require里写死版本(如"dev-main"),且 Composer 每次都要远程探测 tag,性能差、不可靠
真正要接管某个包的下载路径,应该用 type: "package" 显式声明完整元信息,或者确保私有源是标准 type: "composer" 服务并已索引该包。
最容易被忽略的一点:镜像源的可用性 ≠ Composer 的健壮性。你看到日志里“Found package”不代表网络链路稳定,因为超时类错误根本不会触发 fallback,而是直接卡住或失败。










