composer 拉取私有 github 仓库失败主因是未配置有效的 personal access token(pat),需全局配置 composer config --global github-oauth.github.com 并确保 token 含 repo 权限,仓库 url 必须为 https 格式且 type 设为 "vcs"。

Composer 本身不“配置私有仓库”,它只按 composer.json 里写的地址去拉代码;真正决定能否拉下来的是认证——而 GitHub 已全面禁用密码登录,必须用 Personal Access Token(PAT)。
为什么 composer install 卡在 Cloning into 或报 403?
这不是 Composer 的 bug,是 GitHub 在拒绝未认证的 API 请求。未配 Token 时,每小时最多 60 次匿名请求,私有库 + 高频 public 包(比如带 submodule 的)极易触发 rate limit exceeded。错误日志里常见:Failed to clone https://github.com/xxx/yyy.git 或直接卡住不动。
- 确认你不是在用账号密码——GitHub 自 2021 年起已停用密码认证,
git clone都不行,Composer 更不可能行 - 检查 Token 是否真被 Composer 用了:运行
composer install -vvv,搜Authorization: Bearer ghp_,没这行说明 Token 没生效 - 别信“项目级配置也能用”——
composer config github-oauth.github.com(不带--global)只会写进当前项目composer.json,不仅无效,还容易误提交
composer config --global github-oauth.github.com 怎么用才对?
这条命令是唯一推荐的全局 Token 注入方式,它把 Token 写进 ~/.composer/config.json(Windows 是 %APPDATA%\Composer\config.json),后续所有项目都会继承。
- 生成 Token 时,必须勾选
repo(读私有库);如果项目用 GitHub Packages,再加read:packages - 执行命令前,确保终端没开 PowerShell 的变量展开(
$符号会被吃掉),建议用 CMD 或直接编辑文件 - 验证是否写入成功:
composer config --global github-oauth.github.com应该输出你的 Token;如果为空,说明写错了位置或权限不足 - Token 复制时别带前后空格或换行——粘贴后用
echo "x${TOKEN}x"看边界是否干净
私有仓库 URL 必须写成 HTTPS 格式
哪怕你本地 git clone git@github.com:user/repo.git 能通,Composer 的 VCS 拉取机制默认只认 HTTPS 地址。SSH 方式虽可行,但要额外配密钥、改 URL、且 CI 环境常不支持 agent 转发,徒增故障点。
-
composer.json里的repositories必须用"url": "https://github.com/user/private-repo.git",不能是git@开头 - type 必须设为
"vcs",否则 Composer 不会尝试走 Git 协议拉取 - 如果你的私有库没打 Git tag,Composer 默认找不到稳定版本——得手动在
composer.json里指定"version": "dev-main"或类似分支别名
CI 环境(如 GitHub Actions)怎么安全传 Token?
硬编码 Token 到配置文件或命令行里等于公开泄露。GitHub Actions 提供了预置的 ${{ secrets.GITHUB_TOKEN }},它自带 repo 权限,且作用域自动限制在当前仓库。
- 不要在 workflow 中执行
composer config --global命令——secrets.GITHUB_TOKEN是 runtime 变量,无法直接塞进命令参数 - 正确做法:在
auth.json模板里写"github.com": "${GITHUB_TOKEN}",然后用env注入环境变量,Composer 2.2+ 会自动替换 - GitLab CI 同理,用
${CI_JOB_TOKEN},但注意字段名必须是http-basic,key 必须和 URL host 完全一致(比如gitlab.example.com:8443,不能多斜杠、不能带https://)
最容易被忽略的一点:Token 权限 ≠ 账号权限。即使你是仓库 owner,如果 Token 没勾 repo,或者组织启用了 SSO 但没 approve 该 Token,一样 403。别猜,直接去 GitHub Settings → Developer settings → Personal access tokens 里点进去看状态。











