Composer 2.x 镜像配置三要素必须全对:键名是 repo.packagist(单数小写无s)、type值必填composer、URL须HTTPS且以/结尾;缺一即静默回退至packagist.org。

Composer 2.x 镜像配置三要素必须全对
Composer 2.x 不再容忍任何格式偏差:键名 repo.packagist(单数、全小写、无 s)、中间 composer 是必填的 type 值(不是可选参数,更不是命令修饰词)、URL 必须是 HTTPS 且以 / 结尾。漏掉任意一个,就会静默 fallback 到 https://packagist.org,不报错、不提示、也不警告。
-
repos.packagist(多一个 s)→ 写进无效字段,composer config -g repo.packagist查出来是空或null -
composer config -g repo.packagist https://mirrors.aliyun.com/composer/(缺composer)→ 直接跳过该配置,等同于没设 -
https://mirrors.aliyun.com/composer(少末尾/)→ 请求路径拼成/composerpackages.json,返回 404 - HTTP 协议(如
http://)→ Composer 2.9.6+ 默认拦截,连接被拒绝
全局配置 vs 项目级配置:优先用后者
全局配置(composer config -g)在 CI/CD、宝塔、Docker 或多用户环境下极易失效:你用 root 配了,但构建时是 www 用户;你本地配了,新人拉代码后行为不一致;项目里已有 "repositories": {} 就会完全屏蔽全局设置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐做法:进项目根目录(含
composer.json),运行composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g) - 该命令自动向
composer.json的repositories对象中追加"packagist"条目,不覆盖已有私有源 - 若原
repositories是空对象{},命令能安全转为标准结构;若是数组[],需先手动改为对象再执行 - 配置随 Git 提交,CI 构建时直接读取,无需额外 setup 步骤
换源后仍卡住?缓存和 lock 文件必须清
镜像只加速下载,但旧缓存里存着 packagist.org 的元数据和哈希,Composer 会优先读缓存并尝试从旧地址校验——结果就是卡在 DNS 或 TLS 握手,根本没发请求到镜像站。
- 执行
composer clear-cache(注意不是composer cache-clear,后者已废弃) - 删掉
vendor/和composer.lock - 再跑
composer install --no-cache,强制走新源、绕过本地缓存 -
composer.lock里的 dist URL 和哈希来自旧源,与镜像元数据不兼容,保留它必然触发hash does not match
验证是否真走镜像,只看 -vvv 日志
别信 composer config -g repo.packagist 输出了 URL 就以为生效了——那只是配置项,不是实际行为。唯一可靠证据是网络请求打到了镜像域名。
- 运行
composer install -vvv 2>&1 | grep "Downloading" - 日志中必须出现类似
Downloading https://mirrors.aliyun.com/composer/p2/monolog/monolog.json的行 - 或用
composer show monolog/monolog -vvv 2>&1 | grep "Downloading"触发单包拉取,更快验证 - 如果看到
GET https://packagist.org/或Resolving dependencies卡几十秒,说明镜像没生效或依赖解析本身慢(和镜像无关)
composer.json 里写的 repositories 和实际网络请求路径,不是环境变量、不是命令回显、也不是“感觉快了”。每一步都得实锤,尤其 composer.lock 和缓存这两处,最容易被跳过。

















