根本原因是composer默认不信任github enterprise域名,需手动配置github-domains白名单并清除缓存;还需在auth.json中为对应域名配置带repo权限的sso授权personal access token,并在composer.json中显式声明vcs仓库。

Composer 无法访问 GitHub Enterprise 私有仓库,根本原因不是认证失败,而是默认不信任企业版域名 —— 你得手动告诉它哪些域名属于你的 GitHub Enterprise 实例。
github-domains 配置项必须显式声明企业版域名
Composer 从 2.2 开始引入 github-domains 配置,用于白名单化 GitHub 类服务的 API 域名。默认只包含 api.github.com,所有 GitHub Enterprise 实例(如 git.example.com)都必须手动加进去,否则 composer install 会静默跳过私有包或报 Could not fetch 错误。
- 配置位置:全局(
~/.composer/config.json)或项目级(composer.json的config段) - 值必须是字符串数组,每个元素是完整域名(不含协议、路径)
- 不要写
https://git.example.com,只写git.example.com - 如果企业版用了子路径(如
https://git.example.com/github),仍只需填git.example.com—— Composer 只校验 Host
认证方式要匹配企业版的 token 权限和 API 路径
光配 github-domains 不够,还得让 Composer 知道怎么跟你的实例通信。GitHub Enterprise 默认 API 根路径不是 /api/v3,而是 /api/v3 或 /api/v4,取决于版本;token 权限也要开 repo(读私有库)和 read:packages(如果用 Packages)。
- 在
auth.json中为每个企业域名单独配置 token:{ "github-oauth": { "git.example.com": "ghp_abc123..." } } - 确保 token 是 Personal Access Token(不是 OAuth App Token),且勾选了
repo范围 - 如果企业版启用了 SSO,token 必须通过 SSO 授权(生成时点 “Enable SSO” 按钮)
私有包 require 时必须用完整 git URL 或自定义 VCS repo
Composer 不会自动把 "vendor/package": "dev-main" 映射到你的企业版域名 —— 它只认标准 github.com。所以私有包不能靠隐式解析,必须显式指向你的实例。
- 推荐方式:在
composer.json中声明repositories,类型为vcs,URL 用https://git.example.com/owner/repo.git - 不推荐直接写
"require": { "vendor/package": "dev-main" }且不配repositories—— 这会去 github.com 找,404 - 如果使用 GitHub Packages(
npm.pkg.github.com类似物),需额外配repositories.type = "package"和options.auth
最容易被忽略的是:改完 github-domains 后必须运行 composer clear-cache,否则旧缓存里的域名白名单不会更新 —— 这个动作没有提示,但不执行就永远连不上。










