项目级repositories完全覆盖全局配置,Composer不合并仅替换;必须删vendor和composer.lock后重装才能生效镜像,且需显式禁用packagist.org并确保镜像URL正确、type为composer、末尾带斜杠。

项目级repositories完全覆盖全局配置
Composer 不会把全局和项目级的 repositories 数组合并,而是直接丢弃全局定义,只用项目 composer.json 里写的那个数组。哪怕你全局配了阿里云镜像,只要项目 composer.json 里有 "repositories": [](哪怕为空),全局配置就彻底失效。
常见错误现象:
- 运行
composer config --list看到repos.packagist是镜像地址,但composer install还是连packagist.org - 执行
composer config repositories输出为空或只有默认项,说明项目级配置已静默接管
验证方法:进项目目录后分别运行 composer config --list --global 和 composer config --list,对比 repositories 字段是否一致。
全局配置只能设一个 packagist 替代源
repo.packagist(旧版)或 repos.packagist.org(新版)是单值字段,多次执行 composer config -g repos.packagist.org https://xxx 只会覆盖,不会追加。所谓“多个镜像”,必须靠项目级 repositories 数组手动写出来。
关键细节:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 全局命令必须用
repos.packagist.org(注意复数repos+.org),写成repo.packagist或repository都无效 - 全局配置只影响未声明
repositories的项目;一旦项目composer.json里有该字段,全局值即被忽略 - 全局配置不支持私有仓库、VCS 源等类型,仅限替换 Packagist 元数据源
项目级repositories顺序决定实际行为
数组里哪一项生效,不看“优先级”标签,只看位置:从上到下逐个请求,第一个返回有效包元数据(HTTP 200 + JSON 结构正确)的源就锁定使用,后面的全跳过。404 会继续查下一个,但超时、500、DNS 失败会直接报错中断。
实操要点:
- 私有包源必须放在数组最前面,否则可能被镜像“截胡”——镜像没这个包,返回 404,再查私有源,但此时 Composer 已经发过一次无意义请求
- 禁用官方源必须显式写
{"packagist.org": false},且要放在数组末尾(不是开头),否则它不起作用 - 别把
https://repo.packagist.org/和镜像 URL 同时塞进数组——前者会抢在镜像前触发请求,失败即中断,镜像根本没机会响应
删 lock 文件和 vendor 才能真正切换镜像
composer.lock 记录的是包的 hash 和下载 URL 来源,不是镜像配置本身。如果 lock 文件里存的是 packagist.org 的 dist hash,就算你把镜像配得再对,composer install 仍会尝试从官方源拉 zip 包,导致失败或降级。
必须步骤:
- 删掉
vendor/和composer.lock - 确认当前生效的
repositories已正确(用composer config repositories查) - 运行
composer install重新生成 lock 文件,此时所有包元数据和 dist URL 都来自你指定的镜像
最容易被忽略的是:镜像只改元数据获取路径,不代理 dist 文件本身。如果镜像源没同步最新 release,或者你依赖的包不在镜像索引里,就会 fallback 到原始 dist URL——而那个 URL 往往还是 packagist.org 的,这时网络不通就真卡住。

















