必须用 composer config -g github-oauth.github.com 写入全局配置,因 GitHub API 元数据请求发生在安装前全局解析阶段,仅 -g 配置能覆盖全链路;项目级配置、手动编辑 auth.json 或 http-basic 均无效。

必须用 composer config -g github-oauth.github.com 写入全局配置,且 token 至少含 repo 权限——其他方式(如改 composer.json、只配项目级、用 http-basic)基本无效。
为什么 composer config -g 是唯一可靠入口
GitHub API 的元数据请求(比如解析依赖树、查 tag、读 composer.json)发生在安装前的全局解析阶段,此时项目目录下的 auth.json 还没被加载。只有 -g 写入的全局配置能覆盖整个链路。项目级 composer config github-oauth.github.com 只影响当前项目的 composer.json 里 config 字段,对 Packagist 到 GitHub 的元信息抓取完全无感。
常见误操作:
- 漏掉
-g参数,导致 token 只写进当前项目composer.json,换个项目就失效 - 手动编辑
~/.composer/auth.json,JSON 格式出错或权限不对(必须是600,属主为当前用户) - 在 CI 环境中只提交
auth.json到仓库,却没在 job 开头执行composer config -g
github-oauth.github.com 字段名和权限不能错
字段名大小写敏感、嵌套层级固定:github-oauth 不是 github_oauth 或 githubAuth;域名必须是 github.com(GitHub Enterprise 要换成对应实例域名,如 git.example.com)。写错任何一处,Composer 都不报明确错误,只会返回模糊的 Could not fetch 或伪装成 404 Not Found 的 401。
权限方面:
用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git
- 公开包 + 避免限频:至少勾选
public_repo和read:packages - 私有库:必须勾选
repo(它包含public_repo和private_repo) - 用 GitHub Packages:额外加
delete:packages - 别用 fine-grained token —— 当前 Composer 主流版本对其支持不稳定,优先选 classic token
CI/CD 中怎么安全传 token
直接把 token 写进 auth.json 文件再挂载到容器,容易在日志或镜像层泄露。更安全的做法是运行时注入 COMPOSER_AUTH 环境变量:
- 格式必须是合法 JSON 字符串:
{"github-oauth":{"github.com":"ghp_xxx"}} - Shell 中要正确转义双引号:
export COMPOSER_AUTH="{\"github-oauth\":{\"github.com\":\"$GITHUB_TOKEN\"}}" - 该变量优先级高于
auth.json,但若项目根目录存在auth.json,它会被跳过——CI 中务必确保该文件不存在或已重命名 - GitHub Actions 推荐写法:
COMPOSER_AUTH='{"github-oauth":{"github.com":"${{ secrets.GITHUB_TOKEN }}"}' composer install
验证和清理的实操要点
配置后别急着跑 install,先确认是否真正生效:
- 运行
composer config -g github-oauth.github.com,应输出 token 前几位(后段被自动掩码) - 运行
composer diagnose不会检查认证,得真拉一个私有包才暴露问题 - 清除缓存不是必须步骤,但可排除旧响应干扰:
composer clear-cache - 删错配置用
composer config -g --unset github-oauth.github.com,别手动删文件 - 如果始终失败,临时加
--no-auth参数测试是否真由认证环节卡住:composer update --no-auth
最易被忽略的是:token 生效 ≠ 仓库能拉。还得确认 composer.json 里 repositories 的 type 是 vcs、url 是 HTTPS 格式、包名与仓库路径严格一致——认证只是钥匙,门锁本身也得对得上。










