Composer 添加 repositories 后 require 不生效,是因为手动声明 repositories 会关闭默认 packagist.org 源,且不自动 fallback;vcs 仓库仅当包名完全匹配其 composer.json 中的 name 时才解析,且 URL 必须带 .git 后缀、可被 git clone 直接访问。

加了 repositories 却 composer require 不生效,不是配置写错了,而是 Composer 根本没去你写的地址查包——它默认只认 packagist.org,且一旦你手动声明了 repositories 数组,这个默认源就会被完全关闭。
为什么加了 repositories 还是找不到包
根本原因是 Composer 不会“自动 fallback”到你配的仓库,它只按顺序匹配:找到第一个能提供该包名(vendor/name)的仓库就停,后面全忽略。而 vcs 类型仓库压根不参与全局索引,只在你 require 的包名**恰好等于其 composer.json 里声明的 name** 时才临时解析 Git 分支/Tag。
-
repositories是包发现路径表,不是“多源搜索开关” - 没显式加上
{"type":"composer","url":"https://packagist.org","packagist":false},连monolog/monolog都会报错 - vcs 仓库 URL 缺
.git后缀(如写成https://gitlab.com/myorg/sdk),Composer 会静默跳过,不报错也不提示 - 私有 Git 仓库返回 401/403,大概率是
auth.json没放对位置,或域名 key 和 URL 域名不一致(比如 URL 是gitlab.example.com,但auth.json写的是gitlab.com)
type: "vcs" 的 URL 必须满足哪些条件
vcs 类型不是“随便填个网页链接”,它要求地址必须能被 git clone 直接消费,且 Composer 能无交互访问。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 必须带
.git后缀:https://gitlab.example.com/myorg/sdk.git✅,https://gitlab.example.com/myorg/sdk❌ - 不能是 HTML 页面地址:
https://gitlab.example.com/myorg/sdk/-/tree/main或/releases/tag/v1.2.0都无效 - HTTPS 方式带 token 的写法(如
https://token:x-oauth-basic@...)在 Composer 1.10+ 已废弃,必须走auth.json - 验证是否真正可达:终端执行
git ls-remote -h https://gitlab.example.com/myorg/sdk.git,能列出分支才算通
如何让私有包和公共包共存不冲突
关键不是“加多个源”,而是控制路由优先级和兜底行为。项目级 composer.json 中的 repositories 数组决定所有包的查找路径,顺序即优先级。
- 私有源放前面:
{"type":"vcs","url":"https://gitlab.example.com/myorg/internal-sdk.git"} - 紧接着补一条 Packagist 兜底:
{"type":"composer","url":"https://packagist.org","packagist":false}(注意不是删掉,是显式禁用) - URL 末尾斜杠不能省:
"https://my-satis.example.com/"✅,"https://my-satis.example.com"❌(会拼出错误路径) - 别混用类型:同一个逻辑用途下,不要把
vcs和composer源写进同一组路由逻辑;需要强制指定某包走某源,用type: "package"手动声明元数据
auth.json 放哪、怎么写才真正起作用
90% 的认证失败不是 Token 无效,而是文件没被读到——Composer 对路径和字段名极其敏感,且静默跳过错误配置。
- 位置必须是项目根目录下的
auth.json,或全局~/.composer/auth.json;CI 环境建议放项目内并 gitignore 掉敏感值 - 域名 key 必须和仓库 URL 完全一致(包括端口、子域):
"gitlab.example.com"≠"git.example.com" - 字段名只能是
http-basic或github-oauth,不能写成http_auth或token - 权限必须是
600(Linux/macOS):运行chmod 600 auth.json,否则 Composer 会直接忽略
最易被忽略的一点:vcs 仓库的 name 字段必须和 require 中写的**完全一致**,大小写、斜杠方向、vendor 名都不能差——Composer 不做任何推断或归一化,错一个字符就当是另一个包。

















