私有仓库返回404主因是配置不合法致Composer解析阶段静默跳过:type与url不匹配(如composer型缺/、vcs型缺.git)、package型缺必要字段,或未设"packagist.org": false导致仍查官方源。

私有仓库返回404,90%不是网络不通,而是Composer压根没发请求过去——它在解析阶段就因配置不合法直接跳过了该仓库。
为什么composer install根本没访问你的私有URL
Composer 在读取 composer.json 时,会逐条校验 repositories 数组里的每项。只要某条配置的 type 和 url 不匹配,或字段缺失,整条就会被静默丢弃,不会报错,也不会尝试 HTTP 请求。
-
"type": "composer"时,url必须是 HTTPS 地址且以/结尾,例如"https://artifactory.example.com/artifactory/api/composer/my-virtual-repo/";少一个斜杠,就会拼出非法路径,但 Composer 不提示,只当这条不存在 -
"type": "vcs"时,url必须是带.git后缀的 Git 地址(如"https://github.com/org/repo.git"),写成网页地址(https://github.com/org/repo)会被拒绝 -
"type": "package"不能配url,必须提供完整package对象,含name、version、dist或source - 运行
composer diagnose,它会明确指出哪条repository“failed to parse”,比看日志快得多
Artifactory/Satis 仓库返回404的真实原因
即使配置语法正确,私有仓库服务端也可能返回 404,常见于三类部署错误:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Artifactory 上仓库类型选错:必须是
Local、Remote或Virtual,且Package Type下拉框手动选composer(不是默认值);选Generic或Remote (non-composer)会导致Invalid repository type - Satis 镜像未启用静态服务:Satis 生成的是纯文件,
packages.json必须能被curl -I https://satis.example.com/packages.json直接返回200;Nginx 返回403或404,Composer 就会 fallback 到 packagist.org - Virtual 仓库后端没挂 composer 类型源:Artifactory 的 Virtual 仓库若只聚合了
npm或maven源,没拖入至少一个composer类型的 Local/Remote 仓库,请求必 404
项目级配置如何意外禁用私有仓库
哪怕你确认 composer.json 里写了正确的 repositories,仍可能失效——因为 Composer 的优先级规则很隐蔽:
- 只要
composer.json里存在"repositories"字段(哪怕内容是空数组[]),全局配置(如composer config -g repo.packagist)就完全失效 - 私有仓库 URL 必须可直连:在终端运行
curl -I https://your-private-repo.com/packages.json,必须返回200;如果返回301(重定向)、401(认证失败)或超时,Composer 会静默跳过 - GitHub/GitLab 私有包需额外认证:若用
"type": "vcs"指向私有 Git 仓库,必须提前配好 token:composer config -g github-oauth.github.com YOUR_TOKEN,否则元数据获取阶段就卡住 - 别信
composer config --list输出——它只显示配置项,不反映是否生效;唯一验证方式是加-vvv运行composer install,看第一行Downloading的 URL 是否是你私有地址
为什么"packagist.org": false这行不能省
这是最容易忽略的关键点:Composer 默认强制查询 packagist.org,私有仓库只是 fallback。即使你写了完整的 Artifactory URL,只要没显式关掉默认源,Composer 就永远先去官方源查一遍,查不到才轮到你。
- 必须在项目
composer.json的根级别添加:"packagist.org": false - 漏掉这一行,报错永远是
Could not find package vendor/name,哪怕该包 100% 存在于你的私有仓库中 - 注意格式:它和
repositories是同级字段,不是repositories的子项;位置错或缩进错也会导致解析失败 - Artifactory URL 中的
/api/composer/路径不能替换成/api/npm/或/artifactory/—— 协议路径必须精确匹配

















