Composer实际生效镜像源优先级为:环境变量>项目级composer.json>全局config.json;需逐层验证并清缓存,否则配置无效。

确认当前实际生效的镜像源在哪一层
Composer 不是“看配置就用哪个”,而是按固定优先级读取:环境变量 > 项目级 composer.json > 全局 ~/.composer/config.json。只运行 composer config -g repo.packagist 可能完全误导你——它只查全局,但项目里一个 "repositories" 字段就能把它彻底屏蔽。
必须逐层验证:
- 查环境变量:
echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows),非空即生效 - 查项目级:
composer config repo.packagist(不加-g),输出地址就是当前项目真正在用的 - 查全局:
composer config -g repo.packagist,注意键名必须是单数repo.packagist,复数repos.packagist是旧写法,设了也无效 - 直接搜项目文件:
grep -n '"repositories"' composer.json,只要匹配到,不管内容是[]还是{"packagist.org": false},都代表镜像被硬覆盖
覆盖比删除更可靠,尤其对 Composer 2.2–2.4
别再用 composer config -g --unset repos.packagist ——这个命令在 Composer 2.2–2.4 小版本中存在 fallback 逻辑缺陷:删掉字段后可能卡住、报 Could not parse version constraint,甚至静默失败。而且键名写错(repos vs repo)也不报错,只是白忙一场。
正确做法是强制覆盖为官方源:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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 config repo.packagist composer https://packagist.org(不加-g) - 务必带
composer类型前缀,不能写成https://packagist.org或https://repo.packagist.org,否则 Composer 不识别 - 如果之前混设过
repos.packagist和repo.packagist,建议先清理:composer config -g --unset repos.packagist和composer config -g --unset repo.packagist
缓存不清,新配置等于没改
Composer 把镜像源的 packages.json 快照存在 ~/.composer/cache/repo/ 下。哪怕你刚执行完覆盖命令,只要缓存没清,composer update 仍会从旧快照里找包——结果是 Package not found、版本解析错乱,甚至卡在 “Loading composer repositories”。
必须执行:
-
composer clear-cache,确认输出含Clearing cache (all) - 检查缓存目录是否已清空:
ls -la ~/.composer/cache/repo/(Linux/macOS)或dir %APPDATA%\Composer\Cache\repo(Windows) - 验证真实请求地址:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "GET https",日志中必须出现https://repo.packagist.org
项目级 repositories 字段会完全屏蔽全局设置
这是最容易被忽略的一点:只要项目根目录的 composer.json 里有 "repositories" 字段,无论它是空数组 []、对象 {"packagist": false},还是完整镜像配置,Composer 都会跳过全局设置,直接用它。此时改全局毫无意义。
清理方式有两种:
- 手动编辑
composer.json,删掉整个"repositories": {...}或"repositories": [...]块,注意 JSON 语法(逗号、括号配对) - 用命令清除:
composer config --unset repositories(不加-g) - 验证是否清干净:
composer config repo.packagist应输出https://repo.packagist.org,且grep -n '"repositories"' composer.json无输出
composer show -p | head -3 的第一行 URL 是 https://repo.packagist.org/packages.json,且后续安装操作不再访问任何镜像域名。缓存、环境变量、项目配置这三处,漏掉任何一环都会让切换失效。

















