根本原因是未显式禁用packagist.org,默认源优先导致私有包不被匹配;必须在repositories数组中添加{"packagist.org": false},且url末尾斜杠不可省略,仓库类型须为composer。

composer update报“Package not found”但私有包明明已配置
根本不是URL写错或Git仓库不可达,而是Composer默认仍会先查packagist.org,哪怕你已在repositories里写了私有源地址——只要没显式禁用,默认源就永远优先,私有包压根不会被匹配。
必须在composer.json的repositories数组顶部加一条:{"packagist.org": false},且不能漏掉末尾斜杠("https://repo.example.com/"而非"https://repo.example.com");类型必须是"type": "composer",VCS类型(如"type": "vcs")无法参与版本解析优先级竞争。
- 常见错误:把私有仓库放在
repositories数组末尾,又没关packagist.org→ Composer直接跳过你的源 - 兼容性注意:Composer 2.x起才支持
{"packagist.org": false}写法;1.x需用"packagist": false(已废弃,不推荐) - 验证方式:运行
composer config repositories,确认输出中packagist.org显示为false
私有包和公共包共存时版本被意外覆盖
当私有包acme/utils和公共包acme/utils同名时,Composer按repositories声明顺序查找,一旦在前面的源找到就停止,后面同名包完全不可见——这不是bug,是设计行为。
若你希望私有包仅提供特定版本(如^2.0),而其他版本仍走Packagist,就得用only过滤:
{
"repositories": [
{
"type": "composer",
"url": "https://packages.acme.internal/",
"only": ["acme/*", "internal/*"]
},
{"packagist.org": false}
]
}
- 别依赖“先写私有源就能覆盖一切”——如果私有源里没有
acme/utils:3.1.0,而项目require写了"acme/utils": "^3.0",Composer会因找不到匹配项直接报错,不会fallback到Packagist(除非你没关它) -
exclude字段慎用:比如对Packagist加"exclude": ["acme/*"],会导致所有acme包都无法安装,包括你尚未镜像的私有分支 - 真实场景陷阱:Satis镜像未包含某dev分支tag,但项目
composer.json写了"acme/core": "dev-feature/x"→ 报Could not find package acme/core,不是网络问题,是镜像本身没抓取该ref
composer why-not不显示私有包阻断链
composer why-not只分析已注册仓库中**实际存在**的包版本,如果私有包没进元数据(比如Satis没build成功、Nginx返回404、或packages.json路径拼错),它就当这包不存在,自然不会出现在依赖链里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
排查步骤:
- 手动
curl -I https://packages.acme.internal/packages.json,确认返回200且Content-Type是application/json - 打开
packages.json,搜索你的包名,确认version字段存在且格式合法(如"version": "1.2.3",不能是"dev-main"而没配minimum-stability) - 检查私有包
composer.json里的name是否和项目require中写的完全一致(包括大小写、vendor名) - 若用Git仓库直连(
"type": "vcs"),composer why-not可能不生效——它只查composer类型源的元数据,不实时解析Git tag
私有仓库配置后composer install仍卡在packagist.org
现象是命令长时间无响应,strace能看到进程卡在DNS查询或TLS握手——说明{"packagist.org": false}没生效,或者被其他配置覆盖了。
最常忽略的点:
-
config段里的secure-http设为false时,若私有源用HTTP而非HTTPS,Composer会拒绝连接,但错误提示仍是“Could not fetch”,容易误判为网络问题 - 项目根目录存在
auth.json且含github-oauth配置,会干扰私有Git仓库认证(尤其用SSH URL时),建议私有源统一用HTTPS+Token - 全局配置污染:
composer config -g repositories输出里若有packagist.org为true,会覆盖项目级设置,必须用-g参数显式关掉
复杂点在于:这些配置可能分散在项目composer.json、用户家目录auth.json、全局config.json三级,改一处未必生效。真要定位,用composer config --list --global和composer config --list对比输出最可靠。










