composer config -g repo.packagist 不生效是因为未同时满足三个硬性条件:键名必须为 repo.packagist(单数)、第二参数必须显式写 composer(type 值)、URL 必须是 HTTPS 且末尾带 /,缺一则静默回退至 packagist.org。

composer config -g repo.packagist 命令为什么总不生效
根本不是网络或权限问题,而是这条命令有三个硬性条件,缺一即静默 fallback 到 https://packagist.org,且完全不报错、不提示。常见失效写法包括:repos.packagist(多一个 s)、漏掉中间的 composer(type 值)、URL 少了末尾 /(如写成 https://mirrors.aliyun.com/composer ❌)。正确唯一写法是:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/。
怎么确认镜像真的在用,而不是“看起来配好了”
执行完命令没报错 ≠ 生效。必须验证两层:
- 运行
composer config -g repo.packagist,输出必须是完整 JSON 对象,例如:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};若返回空、null、Key not found,或仍是https://packagist.org,说明根本没写进去 - 加
-vvv观察真实请求:composer install -vvv 2>&1 | grep -i mirrors\.aliyun;若日志里没出现镜像域名,或仍看到/packages.json或/p/路径指向packagist.org,说明流量没走过去
项目级配置比全局更可靠,尤其在 CI/CD 和宝塔中
全局配置写在 ~/.composer/config.json,但 GitHub Actions、宝塔后台、Docker 容器通常以 www 或 runner 用户运行,根本读不到你的个人配置。进项目根目录(确保有 composer.json),运行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(注意:不加 -g)
该命令会自动向 composer.json 的 repositories 字段写入 "packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。但要注意:
- 如果
repositories原本是数组([]),命令会失败;需先手动改成对象{} - 切勿手写
"packagist.org": false—— 这会让 Composer 直接跳过所有 packagist 包,而非走镜像 - 改完必须删掉
vendor/和composer.lock,再跑composer install --no-cache;否则 lock 文件里的旧元数据地址会强制回连官方源
换源后还卡在 Downloading?清缓存和旧文件才是关键
镜像只加速下载环节,但 Composer 会优先读取本地缓存和 composer.lock 中记录的旧地址。即使你刚配好镜像,它也可能还在用 packagist.org 的元数据路径发起 TLS 握手,导致卡住。
必须做三件事:
- 运行
composer clear-cache - 删除项目下的
vendor/和composer.lock - 执行
composer install --no-cache(禁用缓存,强制走新源)
最容易被忽略的是:只要项目 composer.json 里存在 "repositories" 字段(哪怕值是空数组 []),全局镜像就彻底失效,且无任何提示。











