答案是配置未落到执行用户或关键字段错误导致静默回退:需用实际运行用户(如www)配镜像,键名必须为repo.packagist、type显式写composer、url以/结尾,且输出必须是完整json;项目级配置需加"packagist.org": false并清理vendor和composer.lock。

内网 Composer 依赖安装失败、卡在 Loading composer repositories、明明配了镜像却还在连 packagist.org——这些问题不是 Composer 有 bug,而是配置没落到执行用户身上,或关键字段写错导致静默 fallback。
确认实际运行 Composer 的用户是谁
宝塔、Docker、GitLab Runner、Jenkins 等环境几乎从不用你当前终端的用户身份执行 composer。你在 root 下执行 composer config -g repo.packagist,但宝塔后台用的是 www 用户,CI 流水线用的是 runner 或 gitlab-runner,它们各自读取 ~/.composer/config.json,互不共享。
- 查真实用户:进对应环境执行
whoami,或看日志里 UID - 给目标用户配:例如宝塔用
www,就运行sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - CI 场景(如 GitHub Actions)建议放弃全局配置,改用项目级:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g),它会安全写入composer.json的repositories字段,Git 可追踪、CI 可复现
验证 repo.packagist 配置是否真生效
composer config -g repo.packagist 输出必须是完整 JSON 对象,比如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。任何偏差都会导致静默回退到官方源:
- 输出为空、
null、或报Key not found→ 没写进去 - 只返回字符串(如
"https://packagist.org")→ 键名或格式错误 - 键名错写成
repos.packagist(多一个s)、漏掉type: "composer"、URL 缺末尾/→ 全部静默失败
项目级配置必须显式禁用 packagist.org
即使写了私有镜像 URL,Composer 默认仍会先查 packagist.org,私有包永远不被匹配。必须在 composer.json 根节点(和 require 同级)加这一行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"packagist.org": false
注意:
- 这行不能嵌套在某个
repositories对象内部,必须是顶层字段 - 私有镜像 URL 必须以
/结尾,否则 Composer 会拼成https://your-mirror.internalpackages.json导致 404 - 改完立刻删掉
vendor/和composer.lock,否则旧 lock 文件里的哈希仍指向原始源,校验失败
局域网私有源要能下载 ZIP,光配 repo.packagist 不够
composer config -g repo.packagist 只换 packages.json 元数据地址,完全不碰包的 dist.url 字段。后者仍来自原始源(如 https://github.com/monolog/monolog/releases/download/2.10.0/monolog-2.10.0.zip),局域网打不开。
- 验证真实 ZIP 地址:
composer show monolog/monolog --verbose,看输出里的dist.url是否还指向 GitHub - 真要跑通,必须让每个
dist.url都指向你内网可直连的 HTTP 路径(如http://nexus:8081/repository/composer-group/monolog/monolog/2.10.0/monolog-2.10.0.zip) - Nginx 或 Nexus 暴露 ZIP 时,
root必须精确指向静态文件目录;必须显式声明types { application/json json; },否则packages.json返回text/plain,Composer 直接跳过
最易忽略的一点:缓存不清理 + 项目级配置覆盖 = 镜像白配。哪怕所有配置都对,只要 composer.lock 里还存着外网的 dist hash,install 就会失败——删锁文件不是可选项,是必做动作。










