多个私有仓库共存时,auth.json 必须按域名分别配置凭证,因 composer config --global 每次重写整个 http-basic 字段而非追加,导致后配覆盖前配;且 composer 查找 auth.json 为顺序优先、不合并,权限错误或域名不匹配均会导致静默失效。

多个私有仓库共存时,auth.json 必须按域名分别写凭证,不能靠重复执行 composer config 覆盖;否则后配的会把前一个删掉,401 就卡死。
为什么 composer config http-basic 只生效一个?
因为每次运行该命令,默认更新的是同一个 auth.json 文件里的 http-basic 对象,键是域名,值是账号密码。同一域名反复写入会覆盖,不同域名则并存——但前提是**你没用 --global 一路覆盖下去**。
- 执行
composer config --global http-basic.pkg1.com u1 p1,再执行composer config --global http-basic.pkg2.com u2 p2,结果只保留pkg2.com的凭证 - 根本原因:全局
auth.json是单个文件,composer config --global每次都重写整个http-basic字段,不是“追加” - 验证方式:
composer config --global --list | grep http-basic,看输出是否只有最后一个
auth.json 放哪儿才真正起作用?
Composer 查找 auth.json 是顺序优先、找到即停,不会合并多个文件。位置错了,配了等于没配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最高优先级:项目根目录下的
auth.json(和composer.json同级),只影响当前项目 - 次高优先级:用户主目录下,Linux/macOS 是
~/.composer/auth.json或~/.config/composer/auth.json;Windows 是%APPDATA%\Composer\auth.json - 权限必须严格:Linux/macOS 下全局
auth.json权限不能高于600(chmod 600 auth.json),否则 Composer 静默忽略 - CI/CD 中别硬编码:用 secrets 注入环境变量,再用脚本生成
auth.json,避免凭据泄露
域名必须和请求 Host 完全一致,不支持子路径或通配符
Composer 认证不看 URL 全路径,只提取 HTTP 请求头里的 Host 字段。填错一级域名,401 就白配。
- 仓库 URL 是
https://packages.mycompany.com/api/v1→ 凭证必须配给packages.mycompany.com,不是api.v1或mycompany.com - 反向代理场景(如 Nginx 把
composer.mycompany.com转发到 Satis)→ 凭证仍要配composer.mycompany.com,不是后端真实服务域名 - 两个子域:
pkg1.example.com和pkg2.example.com必须分开配置,不继承、不通配 - 字段名不能错:
http-basic是顶层键,子对象里必须是username和password,写成user或passwd无效
某些私仓要求 token 填在 username 字段,password 留空
Nexus、Artifactory 等仓库的 Composer 插件实现不统一,有些把 API Token 当作用户名传,密码留空——这不是 bug,是它们的认证协议设计。
- 如果填了
username和password都不生效,试试只填username(放 token),password设为空字符串 - 调试时加
-vvv参数跑composer require,日志里会出现Checking http-basic authentication for pkg.example.com,能确认是否加载了对应域名的凭证 - 敏感信息别进
composer.json,也别提交到 Git;auth.json默认被.gitignore忽略,但建议手动确认一下
最易被忽略的是:凭证域名和仓库 URL 的 Host 不一致,以及权限设置错误导致全局 auth.json 被静默跳过——这两点没有报错提示,只能靠 -vvv 日志和 composer config --list 交叉验证。










