项目级repositories字段完全屏蔽全局配置,必须显式写入composer.json并清理vendor与composer.lock才能生效;repositories须为数组而非对象,且需禁用packagist.org并按序排列镜像源。

项目级 repositories 字段会完全屏蔽全局配置
只要项目根目录下存在 composer.json,且里面定义了 repositories 字段,Composer 就不会读取任何全局镜像配置——不是优先级低,是彻底跳过。你用 composer config -g repo.packagist 配得再准也没用。
常见失效场景包括:
- CI 构建容器里没初始化
~/.composer目录,config -g命令静默失败,配置根本没写进去 - 宝塔面板用
www用户执行命令,却在root家目录配了镜像,两者~/.composer/config.json完全隔离 - 项目里已有
"packagist.org": false,哪怕全局配了镜像,也会被这条规则屏蔽
唯一可靠方式:把镜像源明确写进项目 composer.json 的 repositories 对象中,并执行 composer update --lock。
repositories 必须是对象,不能是数组
很多人直接在 composer.json 里写:"repositories": [],然后用 composer config repo.packagist 往里塞,结果报错或不生效。因为 Composer 要求 repositories 是对象({}),不是数组([])。
正确结构示例:
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
}
如果已经是数组,composer config repo.packagist 会直接报错;如果键名写成 repos.packagist 或 repositories.packagist,也会静默失败。
换源后 vendor/ 和 composer.lock 不清,还是走官方地址
改完 repositories 后运行 composer install,日志里仍出现 packagist.org?不是配置没写对,就是旧缓存和旧锁文件在起作用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Composer 优先读 vendor/ 和 composer.lock 里记录的 URL,哪怕你已经改了配置。
正确清理顺序:
- 先运行
composer clear-cache - 删掉项目下的
vendor/和composer.lock - 再执行
composer install -vvv,看日志里请求的是mirrors.aliyun.com还是packagist.org
如果日志里仍有 packagist.org,说明配置没写对(比如 URL 缺斜杠、type 没写),或者被其他 repositories 条目覆盖但格式错误。
多分支开发时 lock 文件状态不一致导致镜像失效
主干分支可能已生成适配镜像的 composer.lock,而 feature 分支仍沿用记录原始 dist.url 和 hash 的旧 lock,导致 install 时按旧路径去镜像站拉包,结果 404 或校验失败。
关键点:
- 老分支没删过
vendor/和composer.lock,执行composer install时完全跳过元数据解析,直接照搬lock里的旧下载地址 - 不同分支的
composer.json中repositories字段结构可能不统一:有的写成对象,有的是数组,Composer 解析逻辑不同 - CI 流水线拉取分支时默认不带
composer.lock(常被.gitignore忽略),导致每次都是从头 resolve,而 resolve 阶段又依赖当前composer.json是否含有效镜像声明
解决办法:所有分支的 composer.json 必须显式声明 repositories 字段,格式统一为数组,第一项禁用兜底,第二项指定镜像,顺序不能颠倒。










