Composer认证信息严禁写入composer.json,须用auth.json或环境变量;auth.json按项目根目录→COMPOSER_HOME→系统级顺序查找;http-basic域名须与仓库主机名完全一致;推荐用composer config命令生成避免JSON格式错误;CI/CD中应使用COMPOSER_AUTH环境变量传入base64编码的JSON。

Composer 认证信息不能写进 composer.json,否则等于把密码或 token 提交到 Git——这是最常踩的坑。必须用 auth.json 或环境变量,且优先级、路径、格式错一点就 401。
auth.json 放哪才被 Composer 读到
Composer 按固定顺序查找 auth.json:项目根目录 → COMPOSER_HOME 目录(通常是 ~/.composer/auth.json 或 %APPDATA%\Composer\auth.json)→ 系统级配置目录。它不会扫描子目录,也不认 vendor/auth.json 或 auth.json.dist。
- 项目级:放在和
composer.json同一层,仅对该目录下composer install生效 - 全局级:推荐放
COMPOSER_HOME,所有项目共享,避免每个项目重复配 -
git clone后忘记cp ~/.composer/auth.json .?项目级没配又没全局配置,必然失败
http-basic 的域名必须和仓库 URL 主机名完全一致
比如 repositories 里写的是 "https://pkg.internal.company:8080",auth.json 里的 key 就得是 "pkg.internal.company"(端口不参与匹配),少一个点、多一个 www.、带协议前缀都无效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错误示例:
"https://pkg.internal.company"或"www.pkg.internal.company" - 正确示例:
"pkg.internal.company"(哪怕 URL 是https://pkg.internal.company/api/v1) - 运行
composer config --global --list | grep http-basic可确认是否加载成功
用命令行写比手写 JSON 更安全
手动编辑 auth.json 容易多逗号、少引号、用单引号、加注释——这些都会导致 Composer 完全忽略整个文件。用 composer config 命令由 Composer 自己生成,能规避格式问题,还能自动处理权限(如设为 600)。
- 项目级写入:
composer config http-basic.pkg.internal.company alice topsecret123 - 全局写入:
composer config --global http-basic.pkg.internal.company alice topsecret123 - Bearer Token 写法:
composer config --global bearer.api.example.com abcdef123456
CI/CD 里别硬编码 auth.json,用 COMPOSER_AUTH
在 GitHub Actions、GitLab CI 这类环境里,往镜像里塞 auth.json 文件既难维护又易泄露。直接用 COMPOSER_AUTH 环境变量传入 base64 编码后的 JSON 字符串,Composer 会自动解码并当 auth.json 用。
- 值格式必须是合法 JSON 字符串,例如:
{"http-basic":{"pkg.internal.company":{"username":"alice","password":"topsecret123"}}} - 记得用
echo -n '...' | base64编码,别漏-n,否则换行符进去了就解析失败 - 该变量优先级高于磁盘上的
auth.json,适合临时覆盖或动态注入
最容易被忽略的是:某些私有仓库(比如 Nexus、Artifactory)要求用户名/密码用 Base64 编码后传入 HTTP 头,但 Composer 已经帮你做了——你填明文就行,自己提前编码反而 401。还有,secure-http: false 这种配置如果真要用,必须单独放 config.json,且绝不能出现在公网项目中。

















