项目级repositories字段存在时全局镜像完全失效,必须手动编辑composer.json的repositories数组,首位添加{"packagist.org": false},第二位配置带末尾/的镜像url,并删除vendor和composer.lock后执行composer install。

全局配置只写 ~/.composer/config.json,但项目里有 repositories 就完全失效
全局配置不是“优先级低”,而是被直接跳过。只要项目根目录下存在 composer.json 且里面定义了 repositories 字段(哪怕只写了 "packagist.org": false),Composer 就不会读取 ~/.composer/config.json 里的 repo.packagist 配置。
常见误判场景:
- 在项目里执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,以为能统一加速,结果composer install日志里仍是packagist.org - CI 脚本里跑
composer config -g,但构建镜像没初始化~/.composer目录,命令静默失败,配置根本没写入 - 宝塔面板用
www用户运行 PHP,却在root下配了全局镜像,两者配置文件互不可见
项目级配置必须改 composer.json 的 repositories 字段,且结构不能错
项目级配置才是唯一可控、可提交、可复现的方式。它把镜像源明确写进 composer.json 的 repositories 字段,Git 提交后谁拉代码都走同一套源。
关键细节:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
repositories必须是对象({}),不是数组([]);如果是数组,composer config repo.packagist命令会直接报错 - 键名必须是
"packagist"(单数),值必须含"type": "composer"和以/结尾的 HTTPS URL - 如果已有
"packagist.org": false,得先删掉,否则镜像配置会被屏蔽 - 改完必须运行
composer update --lock,否则composer.lock仍指向旧源地址
验证是否真生效,别信命令输出,要看日志和诊断结果
命令没报错 ≠ 配置生效。Composer 对错误配置(如键名拼错、漏 composer type、URL 少斜杠)会静默 fallback 到 https://packagist.org,不提示也不报错。
真正有效的验证方式:
- 运行
composer config -g repo.packagist:输出必须是完整 JSON 对象,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};返回空、null或报Key "repo.packagist" does not exist,说明根本没写进去 - 运行
composer diagnose:看Repo packagist.org:后面的地址是不是你设的镜像 - 运行
composer update -vvv:搜日志里的GET行,确认域名是mirrors.aliyun.com或你配的镜像地址
老项目换镜像容易出错,本质是 lock 文件绑定官方源
Composer 2.2+ 默认启用 packagist.org 隐式兜底,但老项目 composer.lock 里记录的是官方源的 dist URL 和 hash。换镜像后不重生成 lock,下载时仍走官方链接——而镜像常不同步旧包(如 symfony/console v3.4),导致 Could not find package 错误。
更隐蔽的问题:
- 镜像站默认只保留最近 2 年活跃包,PHP 7.4 及以下项目依赖的某些包可能已被移除
- 老项目没声明
repositories字段,看似用了全局镜像,实际元数据还是从官方拉(因锁文件哈希校验强制回源) - 全局配置在 Docker、宝塔、GitHub Actions 里大概率读不到——它们不是以你当前用户身份运行的










