composer install 卡在 github api 限流是因为未认证请求被限速至60次/小时;解决方法是配置带repo和read:packages权限的github token,执行composer config -g github-oauth.github.com 。

为什么 composer install 突然卡在 GitHub API 限流?
因为 GitHub 对未认证的 API 请求有严格限速(60 次/小时),Composer 默认走匿名请求,一旦项目依赖含私有库、或大量 public repo(尤其含 dev- 分支或 composer.json 中写了 "type": "package"),就会触发限流,报错类似:Failed to download vendor/package: Could not fetch https://api.github.com/repos/vendor/package/zipball/xxx: {"message":"API rate limit exceeded"}。这不是 Composer 问题,是 GitHub 的安全策略。
解决办法不是换镜像,而是让 Composer 带上你的 GitHub Token 去调用 API —— 这相当于“刷脸进厂”,额度立刻升到 5000 次/小时。
怎么生成并配置 GitHub Token?
Token 必须带 repo 权限(读私有库)和 read:packages(如果用 GitHub Packages)。别开 delete_repo 或 admin:org 这类高危权限。
- 访问
https://github.com/settings/tokens/new,勾选repo和read:packages,生成后立即复制——页面关闭就再也看不到明文了 - 运行命令配置全局凭据:
composer config -g github-oauth.github.com <your_token_here></your_token_here> - 验证是否生效:
composer config -g github-oauth.github.com应输出 token 前几位(Composer 会自动掩码显示)
注意:不要把 token 写进项目级 composer.json 或 auth.json 明文提交;-g 是用户级配置,安全且复用。
为什么配了 token 还是 401 或 403?
常见三个原因:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Token 过期或被手动删了 —— GitHub Token 默认不过期,但你可能在 Settings → Tokens 页面点过
Delete - 用了
github.com域名,但实际仓库在github.***.com(比如 GitHub Enterprise Server)—— 此时必须配composer config -g github-oauth.github.***.com <token></token> - 公司网络拦截了
api.github.com的 Authorization Header —— 可临时改用git协议拉取(在composer.json加"options": {"github-protocols": ["git"]}),但这绕过 API,不解决根本限流问题
错误信息里如果出现 401 Unauthorized,大概率是 token 错了;403 Forbidden 则多因权限不足或企业版域名不匹配。
CI/CD 环境下怎么安全传 token?
本地配 -g 不适用于 CI。正确做法是用环境变量 + auth.json 动态生成:
- CI 脚本中写:
echo '{"github-oauth": {"github.com": "'"$GITHUB_TOKEN"'}}" > ~/.composer/auth.json - 确保
$GITHUB_TOKEN是 CI 平台加密的 secret,绝不能打日志 - 不要用
composer config在 CI 里写入,因为不同 job 可能并发写冲突,且残留风险高
GitHub Actions 用户注意:secrets.GITHUB_TOKEN 是仓库级 token,权限受限,不能用于跨仓库安装;必须用自建的 Personal Access Token 并设为 secret。
真正麻烦的是混合源:既有 GitHub,又有 GitLab 或私有 Satis 服务。这时候每个域都要单独配 github-oauth、gitlab-token、http-basic,漏一个就 fallback 到限流路径。










