composer 2.x 全局配置 repo.packagist 失效的根本原因是键名、type 值和 url 格式三者必须严格匹配:键名只能是 repo.packagist,type 必须为 "composer",url 必须是 https 且末尾带斜杠;否则静默回退至 packagist.org。

composer config -g repo.packagist 命令为什么总不生效
根本原因不是网络或权限,而是 Composer 2.x 对配置项的格式要求极其严格,错一个字符就静默 fallback 到 packagist.org。
必须同时满足这三点,否则 composer config -g repo.packagist 看似执行成功,实际没写进配置:
-
repo.packagist是唯一合法键名 —— 写成repos.packagist、packagist.org或repositories.packagist全部无效 - 中间的
composer是强制 type 值,不能省略,也不能写成composer-type或注释形式 - URL 必须是 HTTPS 协议,且末尾带斜杠:
https://packages.internal/✅,https://packages.internal❌(会拼出/packages.json/packages.json导致 404)
验证是否真生效:运行 composer config -g repo.packagist,输出必须是完整 JSON 对象,例如:
{"type": "composer", "url": "https://packages.internal/"}
如果返回空、null、Key not found,或只有一行 URL 字符串,说明配置失败,需重试。
项目级配置比全局配置更可靠
团队协作、CI/CD 或多用户环境里,-g 全局配置基本不可靠 —— 它只写入当前用户的 ~/.composer/config.json,而 CI 流水线常用 www-data 或 runner 用户,新人 clone 项目后也完全不受影响。
推荐在项目根目录下直接运行:
composer config repo.packagist composer https://packages.internal/
这条命令会自动向项目 composer.json 的 repositories 字段追加一个 key 为 "packagist" 的条目,前提是原 repositories 是对象结构(如 "repositories": {})。如果是数组("repositories": []),会报错,需先手动改为对象。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
切记:项目级配置能随 Git 提交,所有协作者和 CI 环境行为一致,且优先级高于全局配置。
必须禁用 packagist.org 才能真正走 Satis
哪怕 packages.json 已能被 curl 正常访问,只要项目 composer.json 里没显式关掉默认源,Composer 就仍会先尝试连接 https://repo.packagist.org,超时后才 fallback —— 这就是你看到 “Could not fetch” 或安装卡住的根本原因。
项目 composer.json 中必须包含这两项:
-
"packagist.org": false—— 注意是布尔值false,不是字符串"false",也不是"packagist": false -
"repositories"数组中必须有{"type": "composer", "url": "https://packages.internal/"},且 URL 末尾带/
常见错误:"packagist": false 是无效字段,它会屏蔽基础包校验,导致 require 失败;"packagist.org": "false" 是字符串,Composer 不识别。
Satis 镜像部署后必须清缓存再 install
镜像只加速元数据下载,但 Composer 默认优先读取本地缓存和 composer.lock 中记录的旧地址。哪怕你刚配好 Satis,它也可能还在往 packagist.org 发请求。
换源后必须执行这三步才能确保走新源:
-
composer clear-cache—— 清掉本地元数据缓存 -
rm -rf vendor composer.lock—— 彻底删除旧依赖和锁定文件 -
composer install—— 重新拉取,此时才会真正读取packages.json并从 Satis 下载 dist
漏掉任何一步,都可能出现“配置对了但还是卡在 Loading composer repositories”。










