答案是Composer查源顺序为环境变量>项目级composer.json>全局配置repo.packagist;需逐层验证:查环境变量、项目级repositories、全局repo.packagist,并用composer require --no-install -vvv观察真实请求URL确认生效层。

确认当前生效的镜像源在哪一层被劫持
Composer 查源顺序是:环境变量 > 项目级 composer.json 中的 repositories > 全局配置 repo.packagist。只看 composer config -g repo.packagist 输出会误判——它可能显示空或官方地址,但实际请求仍走镜像。
必须逐层验证:
- 查环境变量:
env | grep COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows),非空必须清除 - 查项目级:
composer config repo.packagist,若返回镜像 URL 或不报错,说明composer.json里有repositories块 - 查全局:
composer config -g repo.packagist,注意是单数repo.packagist,不是复数repos.packagist
执行重置命令时键名和类型不能错
composer config -g --unset repos.packagist 在 Composer 2.x 上基本无效:一是键名应为 repo.packagist(单数),二是 --unset 后 Composer 2.2–2.4 有 fallback 缺陷,可能卡在 Could not parse version constraint。
真正稳的操作是显式覆盖:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer config -g repo.packagist composer https://packagist.org - 必须带
composer类型前缀,不能省略 - URL 必须是完整 HTTPS 地址,不能是
http://或路径结尾带斜杠
缓存和项目级配置必须同步清理
只改全局配置不清理其他两处,composer update 仍会失败或走错源。
- 清缓存:
composer clear-cache——否则旧镜像的packages.json快照还在,导致Package not found或版本解析错乱 - 删项目级
repositories:composer config --unset repositories(在项目根目录下),或手动删掉composer.json中整个"repositories": {...}或"repositories": []块(注意保持 JSON 合法) - 清环境变量:
unset COMPOSER_REPO_PACKAGIST(Linux/macOS)或set COMPOSER_REPO_PACKAGIST=(Windows CMD,等号后无空格)
验证是否真连上 packagist.org 而非看配置输出
composer config -g repo.packagist 的输出只是“你设了啥”,不是“它连了哪”。唯一可靠验证方式是看真实 HTTP 请求日志。
- 运行
composer require monolog/monolog --no-install -vvv - 滚动日志中找
Downloading https://repo.packagist.org/—— 这个 URL 出现才算成功 - 如果看到
mirrors.aliyun.com或mirrors.cloud.tencent.com,说明环境变量、项目级repositories或缓存至少有一处没清干净
最麻烦的不是命令输错,而是以为清了缓存就完事——旧镜像元数据一旦进缓存,Composer 会优先复用,根本不发新请求。每次重置后必须用 -vvv 实测网络行为,不然永远不知道哪一层还在偷偷生效。

















