镜像对私有仓库完全无效,因其仅缓存公开包元数据,不代理vcs请求或携带token;私有github仓库必须直连,依赖全局github-oauth配置或项目级auth.json(600权限、classic token含repo权限)认证。

不能在 Composer 镜像(如 packagist.phpcomposer.com)里配置私有 GitHub 仓库的访问权限——镜像只缓存公开包,不代理私有仓库认证。 私有 GitHub 仓库必须绕过镜像,直连 GitHub,靠 auth.json 或全局 github-oauth 配置提供 Token 认证。
为什么镜像配置对私有仓库完全无效
Composer 镜像(如阿里云、腾讯云或 phpcomposer.com 提供的)本质是 Packagist 的只读缓存节点,只同步 packagist.org 上已公开索引的包元数据和 dist ZIP。它不处理 vcs 类型仓库,也不转发 Git 克隆请求,更不会携带你的 Token 去 GitHub。
- 你在
repositories里配了"type": "vcs",Composer 就直接走 Git 协议拉代码,根本不会查镜像 - 如果你误把镜像 URL 写进
repositories(比如{"type": "composer", "url": "https://mirrors.aliyun.com/composer"}),那只是覆盖了公共源,私有仓库依然要单独配vcs+ 认证 - 镜像配置只影响
type: composer的源,对 GitHub/GitLab 这类type: vcs源无任何作用
正确做法:禁用镜像对私有仓库的干扰
一旦你在 composer.json 的 repositories 字段里加了任何条目,Composer 默认关闭自动注入 packagist.org,这会连带让镜像失效(因为镜像本身是通过 packagist.org 注入的)。必须显式恢复官方源并确保它排在第一位:
- 在
repositories数组最开头加:{"packagist": true}(Composer 2.2+)或{"packagist.org": true}(旧版) - 或者显式写入镜像地址:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},但注意这仍是公共源,不影响私有仓库 - 私有仓库条目必须另起一项,
"type": "vcs","url"用 HTTPS 格式(如https://github.com/your-org/private-repo) - 执行
composer clear-cache,否则旧配置可能被缓存,导致认证不生效
GitHub 私有仓库认证必须用 classic Token + github-oauth
GitHub 已停用密码和 fine-grained token 对 Composer 的支持,只认 Tokens (classic),且必须包含 repo 权限(组织仓库还需 read:org):
- 生成 Token:GitHub Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token
- 写入全局配置:
composer config -g github-oauth.github.com <your-token></your-token>(注意是-g,不是--global) - 验证是否生效:
composer config -g github-oauth.github.com应输出***,不是空行 - 如果用 GitHub Enterprise,请额外运行:
composer config -g github-domains ["ghe.example.com"],并为该域名单独配 Token
auth.json 权限错会导致静默失败
哪怕 Token 正确、repositories 正确,只要 auth.json 文件权限不对,Composer 就会跳过读取,不报错也不提示:
- 项目级
auth.json(与composer.json同目录)权限必须是600:chmod 600 auth.json - 内容结构必须严格为 JSON 对象,
github-oauth是顶层字段,不是嵌套在http-basic下 - 错误示例:
{"http-basic": {"github.com": {"username": "...", "password": "..."}}}—— 这是 Bitbucket 写法,GitHub 不认 - 正确示例:
{"github-oauth": {"github.com": "xxx..."}}
最关键的遗漏点往往不在 Token 本身,而在 repositories 配置后忘了开回 packagist,或 auth.json 权限设成 644 导致认证被静默丢弃——这两处一错,composer install 就只会报模糊的 Could not fetch 或 Could not find package,而不会告诉你到底卡在哪一步。











