必须显式禁用packagist.org默认源({"packagist.org": false}作为repositories数组独立项),否则私有仓库即使排第一也无效;禁用后才按数组顺序匹配,首个返回非404元数据的仓库胜出。

关不掉默认源,所有仓库优先级配置都等于没配。 Composer 没有“白名单”开关,所谓限制来源,本质是两步:先彻底禁用 packagist.org 的隐式兜底,再显式声明你信任的仓库,并靠顺序控制谁先响应。
为什么私有包总从 packagist.org 装,而不是你的仓库
根本原因是 packagist.org 默认永远在最后被查——哪怕你把私有仓库写在 repositories 数组第一位,Composer 仍会先去官方源找一遍。只要它返回了同名包(哪怕只是个空壳或旧版),后续仓库就全被跳过。
- 禁用必须显式:
"packagist.org": false是唯一合法键名,"packagist": false或"packag.com"都会被静默忽略 - 这个开关不是仓库,不能嵌进其他对象里,比如
{"type":"composer","url":"xxx","packagist.org":false}是错的 - 它必须是
repositories数组里的一个独立项,且放在私有源之后、数组末尾
如何让私有仓库真正优先生效
禁用默认源后,repositories 数组才按从上到下顺序匹配:第一个返回非 404 元数据的仓库胜出,后面全忽略。这不是比版本,是「命中即停」。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 私有仓库类型选
"type": "composer",URL 指向你托管的packages.json地址 - 确保该
packages.json里providers字段明确列出了你要的包,例如"myorg/utils": {"versions": {"1.0.0": {...}}} - 如果只对个别包生效,用
"type": "vcs"更安全,但仅响应composer require myorg/utils这种显式调用,不参与全局查找
镜像源和私有源能共存吗?怎么配才不翻车
可以共存,但必须分工明确:私有源管特定包,镜像源兜底其余公开包。混配失败的主因是把镜像当“增强版默认源”,而它只是 packagist.org 的只读代理,不托管私有包。
- 顺序应为:
私有 composer 源→镜像源(type: "composer")→{"packagist.org": false} - 千万别同时写
https://packagist.org和镜像地址——Composer 会优先连原站,断网即失败,镜像根本不会触发 - 验证是否生效:运行
composer config repositories,输出中必须同时包含你的私有 URL 和"packagist.org": false;再加-vvv跑一次composer update myorg/utils,看日志里是否出现Reading composer.json of myorg/utils及对应 URL
最容易被忽略的一点:禁用默认源后,Composer 不会自动探测包归属,也不会 fallback 到未声明的源。你声明的每个仓库,都得自己提供完整的元数据——少一个 providers 条目,那个包就直接报错“not found”,不会提醒你漏了什么。










