composer仓库优先级由repositories数组顺序严格决定,首个返回http 200且json可解析的源即被锁定使用;私有源须置顶,packagist.org须以独立对象{"packagist.org": false}显式禁用并置于末尾,type字段不可混用。

repositories数组顺序就是实际优先级
Composer 不识别 priority、weight 或 canonical(除非用极老插件),它只按 repositories 数组从上到下的书写顺序逐个发起元数据请求,第一个返回 HTTP 200 + 可解析 JSON 的仓库就锁定使用,后续全部跳过。这不是 fallback,是硬性短路逻辑。
常见错误现象:composer require acme/utils 装了 packagist.org 上的同名包,而不是你私有仓库里的版本——根本不是网络延迟导致的“偶然拉错”,而是私有源写在了数组末尾,被官方源抢先命中。
- 私有
type: "composer"仓库(如 Satis、Private Packagist)必须放在repositories数组最前面 -
type: "vcs"仓库(如 Git 地址)不参与全局元数据匹配,只对composer require vendor/name显式调用生效,所以它不抢顺序,但也不能覆盖laravel/framework这类基础包 - 运行
composer config repositories查看当前真实生效顺序,别依赖注释或记忆
packagist.org 必须显式禁用,否则永远兜底
默认情况下,Composer 会把 https://packagist.org 当作隐式兜底源——哪怕你把阿里云镜像写在第一位,只要它对某个包返回 404(比如新包尚未同步),Composer 就立刻切回官方源,看起来像“镜像没起作用”。
禁用方式是在 repositories 数组**末尾**添加一个独立对象:{"packagist.org": false}:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不能写成根节点字段(旧版写法,已失效)
- 不能嵌套在其他对象里,必须是数组里的单独一项
- 键名必须精确为
packagist.org(少一个点或拼错都不行) - 验证是否生效:运行
composer config repositories,输出中不应出现https://repo.packagist.org,且应明确看到"packagist.org": false
type 字段决定行为,混用等于无效
type 不是可选字段,它决定了 Composer 怎么用这个仓库。常见类型不能混着当“通用源”使:
-
"type": "composer":对应完整 Packagist 镜像,含packages.json,支持全局搜索和版本解析;URL 必须以/结尾(如https://mirrors.aliyun.com/composer/) -
"type": "vcs":只对require中显式写的包名生效,不会参与包发现;dev-main分支不会自动映射为dev-main版本,必须在require里写死"myorg/pkg": "dev-main" -
"type": "package":手动声明单个包的元数据,适合 Git 地址不想暴露给所有开发者时;但不支持dev-main别名,必须写死语义化版本(如"1.2.0")
错误示例:{"type":"vcs","url":"https://git.example.com/pkg"} 放在 repositories 里,却期望它能 fallback 到其他包——它根本不会参与全局查找。
path 类型仓库也严格遵循顺序,且路径必须合法
多个本地 path 仓库必须逐个显式声明在 repositories 数组中,不支持通配符或自动扫描。每个 url 必须是相对当前 composer.json 的有效路径,且对应目录下必须存在合法 composer.json,其中 name 字段需与 require 中的包名完全一致。
- 同名包仅取
repositories数组中首个匹配的仓库,无 fallback 机制 - 若两个
path仓库里都有acme/core,只有第一个会被使用,第二个完全无效 - 哪怕第一个
path下的包因分支名不匹配(如要求dev-main但该目录只有main分支)而安装失败,也不会尝试第二个path - 路径含空格或特殊字符时,需确保 shell 层能正常解析(一般建议避免)
真正容易被忽略的是:私有源本身是否生成了合法、完整的 packages.json。如果它返回 404 或 JSON 结构错误,Composer 就不会把它当“可用源”,直接跳过——哪怕它排在第一位。










