Private Packagist 的 token 必须通过 composer config -g http-basic 全局配置,不可仅改 composer.json 或手写 auth.json;需禁用 packagist.org 并正确定义私有源,且包须在后台启用、名称大小写敏感;内网 HTTP 部署必须配 TLS 证书。

Private Packagist 的 token 必须用 composer config -g http-basic 注册
只改 composer.json 里的 repositories,不配 token,必然失败。Private Packagist 不接受匿名请求,也不认 auth.json 里手写的凭证(尤其在 CI 中容易错位)。
正确做法是:
- 在 Private Packagist 后台「API Tokens」页生成一个
read或read-writetoken - 执行
composer config -g http-basic.repo.packagist.com <your-token> ""</your-token>(注意密码字段必须为空字符串) - 该命令会把凭证写进全局
$COMPOSER_HOME/auth.json,Composer 每次请求都会自动带上Authorization: Basic头,格式完全匹配服务端预期
CI 环境可用 COMPOSER_AUTH 环境变量注入,值为:{"http-basic":{"repo.packagist.com":{"username":"TOKEN","password":""}}} —— 这比挂载文件更可控。
项目 composer.json 必须显式禁用 packagist.org 并声明私有源
默认情况下 Composer 仍会 fallback 到 packagist.org,哪怕你加了私有源。这会导致:私有包被跳过、同名包从公网拉取、甚至因权限冲突报 401。
需在项目 composer.json 的 repositories 字段中同时做两件事:
- 用
"packagist": false彻底关闭默认源 - 用
"private-packagist": { "type": "composer", "url": "https://repo.packagist.com/your-org/" }声明你的私有地址(URL 必须以/结尾)
顺序很重要:私有源必须排在 "packagist": false 之后,且不能漏掉 type 字段;写成 vcs 或留空会直接导致元数据解析失败。
package not found 不一定是配置错,很可能是包未“启用”或大小写不匹配
Private Packagist 对包可见性控制极严:GitHub/GitLab 仓库连上了 ≠ 包能被安装。常见卡点:
- 该包未在后台「Packages」列表中手动点击启用(enabled 开关为灰色 = 不可发现)
- 包名拼写错误,比如
acme/MyLib和acme/mylib被视为两个不同包 - 私有 Git 仓库(如
git@github.com:acme/private-lib.git)需在后台完成 sync,并勾选「Include in composer repository」 - 缓存残留:执行
composer clear-cache再试,旧packages.json可能还记着 404 结果
别急着重配 token——先登录 Private Packagist 后台,确认目标包状态栏显示 “Enabled” 且版本号可见。
HTTPS 强制与内网部署的隐性冲突
Composer 3.0+ 默认拒绝非 HTTPS 的私有源 URL。如果你在内网用 HTTP 协议部署了 Private Packagist 实例(比如 http://packagist.internal),即使加了 repositories,也会静默失败或报 Connection refused。
解决方式只有两个:
- 给内网实例配合法 TLS 证书(推荐,避免后续工具链兼容问题)
- 降级 Composer 版本(不推荐,放弃安全与新特性)
没有第三条路。临时加 --no-secure-http 在新版已移除,硬改源码绕过验证属于自毁式运维。


















