composer按repositories数组顺序从上到下查找包,命中即停;私有仓库须置顶,且必须显式添加{"packagist": false}禁用默认源,否则packagist.org隐式排在最后兜底,导致私有包被跳过。

私有仓库必须放在 repositories 数组最前面,且必须显式禁用 packagist.org,否则它永远兜底、你的配置形同虚设。
为什么 composer require 还是从 packagist.org 装包?
根本不是顺序写错了,而是你没关掉默认源。Composer 默认隐式启用 packagist.org,且它**自动排在所有显式声明的 repositories 之后**——哪怕你把私有源写在第一位,Composer 仍会先查完所有显式源(可能都 404),最后再去 packagist.org 找。一旦它返回了同名包的元数据(哪怕只是旧版),查找就终止,你的私有源根本没机会响应。
- 必须在
composer.json的repositories数组里加入{"packagist": false},且它不能放最前,得放在私有源之后(它是开关,不是仓库) - 别用
composer config -g repos.packagist false全局禁用——会影响其他项目,且无法绑定私有源 - 验证是否生效:运行
composer config repositories,确认输出中既有你的私有 URL,也有"packagist": false
repositories 数组顺序到底怎么影响查找?
Composer 是「从上到下线性扫描,命中即停」,不是「比对全部再选最优」。只要第一个仓库返回了满足 require 版本约束的任意可用版本,后续仓库里的 dev-main、2.1.0@beta 或更新的稳定版都不会被考虑。
- 多个私有仓库共存时,把最可信、最新、最优先使用的那个放在数组最顶部
- 如果两个仓库都声明了
myorg/utils,只有第一个生效;第二个即使有 v2.0.0,也完全被忽略 - 数组必须是索引格式(
[]),写成对象({})会导致只读取最后一个元素 -
vcs类型仓库(如 Git URL)不参与全局元数据匹配,只对require中显式写的包生效,且不会 fallback 到下一个仓库
type 字段填错,URL 再对也没用
type 不是可选标签,它直接决定 Composer 怎么解析 url:协议不对,行为就全错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"type": "composer"→ 预期一个提供packages.json的 HTTP 服务(如 Satis、Private Packagist、阿里云镜像);若配成私有 GitLab 地址,会尝试 GET 一个 HTML 页面,静默失败 -
"type": "vcs"→ 必须是 Git/SVN/Hg 仓库地址(如https://gitlab.com/org/pkg.git),Composer 会 clone 并读取其中的composer.json -
"type": "package"→ 手动声明单个包的完整元数据,适合闭源 ZIP 分发;但它不支持通配或自动发现,且优先级规则相同:排前面就拦截所有对该包的请求 - 国内镜像(如阿里云)本质是
packagist.org的只读代理,type必须为"packagist"或"composer",不能用vcs
怎么确认某个包真从你的私有源装的?
光看 composer.json 顺序没用,得看 Composer 实际请求了谁。最可靠方式是加详细日志:
运行 composer update -vvv vendor/package,观察输出中是否出现你的私有源 URL,并确认有没有类似 Found package "vendor/package" in version "x.y.z" 的行。如果日志里压根没请求你的 URL,大概率是:packagist.org 没关、URL 拼错、HTTP 404/403(Composer 默认静默跳过)、或私有源的 packages.json 根本没声明这个包名。
已安装后,可用 composer show vendor/package 查来源 URL,但注意:它只反映当前状态,不反映解析过程;真正要验证逻辑,必须跑一次带 -vvv 的更新。










