私有仓库必须置于repositories数组首位并显式禁用packagist.org:Composer按顺序查找源,仅当私有源为首个且末尾含{"packagist.org": false}时,才能确保私有包优先且不回退官方源。

私有仓库必须放在repositories数组最前面
Composer 查包是线性短路逻辑:从 repositories 数组第一个元素开始,逐个发请求,只要某个源返回 HTTP 200 + 可解析的 JSON 元数据(哪怕不含你要的包),就立刻锁定它,后续全跳过。如果你把私有仓库写在第二位、第三位,而第一位是阿里云镜像或 packagist.org,那同名包永远进不了你的私有仓。
常见错误配置:
- 把
{"type":"vcs","url":"https://gitlab.example.com/my/utils"}放在数组末尾 - 用
composer config repo.my-private composer https://private.example.com命令追加,结果它被插到数组最后 - 误以为“私有包自动优先”,其实 Composer 完全不识别“私有”语义,只认顺序
正确做法:手动编辑 composer.json,确保私有项是 repositories 的第一个元素,且 type 明确为 vcs 或 composer(取决于你用的是 Git 地址还是 Satis/Artifactory)。
必须显式禁用 packagist.org 才能真正生效
默认情况下,Composer 会把 https://packagist.org 当作隐式兜底源——哪怕你把私有仓库放第一位,只要它对某个包返回 404(比如新包还没同步),Composer 就立刻切回官方源。这不是 fallback,是设计行为。所以光写私有源不够,你还得主动关掉这个默认通道。
关键操作:
- 在
repositories数组**末尾**单独加一个对象:{"packagist.org": false} - 不能写成
"packagist.org": false在根节点(旧版写法,已失效) - 不能嵌套在其他对象里,必须是数组里的独立元素
- 键名必须精确为
packagist.org,少一个点或拼错都不行
验证是否生效:运行 composer config repositories,输出中不应出现 https://repo.packagist.org,且应明确看到 "packagist.org": false。
vcs 类型仓库不参与全局搜索,只响应显式 require
如果你用的是 Git 地址("type": "vcs"),它根本不会出现在 Composer 的全局包索引匹配流程中。也就是说,composer update 不会扫描它找 monolog/monolog 或任何其他包;只有当你执行 composer require vendor/name,且该 vendor/name 和 vcs 仓库里 composer.json 中的 name 字段**完全一致**时,它才被拉取。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这意味着:
- 不能靠 vcs 仓库“覆盖”
laravel/framework这类基础包——它们必须走type: "composer"源 - 多个 vcs 同名包,只认数组里第一个,后一个彻底无效
- 分支名如
dev-main不会被镜像源同步,vcs 本身也不保证稳定,慎用于生产依赖
想让私有包被全局识别,必须用 type: "composer" 搭配 Satis、Artifactory 或 Private Packagist 等服务,生成完整的 packages.json 索引。
镜像源 type 必须声明为 packagist,不能只改 URL
很多人把 "url": "https://packagist.org" 直接替换成 "https://mirrors.aliyun.com/composer/",但没写 "type": "packagist",结果镜像形同虚设。Composer 对 type: "packagist" 有特殊协议支持:模糊搜索、包名自动补全、版本范围解析都依赖它。只改 URL 会被当成普通 type: "composer" 源,功能残缺,还可能漏包。
正确结构示例:
{
"repositories": [
{"type": "vcs", "url": "https://gitlab.example.com/my/internal"},
{"type": "packagist", "url": "https://mirrors.aliyun.com/composer/"},
{"packagist.org": false}
]
}
注意:
-
type: "packagist"的镜像必须放在私有 vcs 之后、{"packagist.org": false}之前 - 不要混用
type: "composer"和type: "packagist"指向同一类服务(比如都指阿里云),前者无法启用完整索引能力 - 国内镜像基本不抓取
dev-分支,需要开发版依赖时,vcs 是唯一可行路径,但要接受 commit hash 锁定带来的不可控性
顺序、type、显式禁用——这三点漏掉任何一个,私有仓库的优先级就等于没配。最常被忽略的是 {"packagist.org": false} 必须作为独立数组项写在末尾,而不是塞进某个对象里;还有人以为改了 URL 就算切换镜像,结果发现 composer show 查不到包,其实是 type 缺失导致索引能力降级。

















