composer镜像源配置不生效主因是repositories字段非数组、首项未设{"packagist.org": false}、未删vendor和composer.lock,导致仍连packagist.org。

Composer 镜像源配置不生效,基本不是网络问题,而是 composer.json 里 repositories 字段写法错误、顺序错位或残留旧文件导致的——它根本不会报错,只会默默连 packagist.org,卡在 Loading composer repositories。
composer.json 中 repositories 字段必须是数组且首项禁用官方源
Composer 2.2+ 强制要求 repositories 是数组,对象形式(如 "repositories": {})会被静默忽略。更重要的是,第一项必须显式禁用官方源:
-
{"packagist.org": false}必须作为独立对象放在repositories数组首位 - 不能合并进镜像条目里,例如
{"packagist.org": false, "type": "composer", "url": "..."}是无效的 - 不能写成
"packagist.org": true或null,只有false才代表禁用 - 私有源(如 GitLab 的
"type": "vcs")应追加在镜像配置之后,保持数组顺序
正确结构示例:
"repositories": [
{"packagist.org": false},
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},
{"type": "vcs", "url": "https://git.example.com/my/package.git"}
]
改完 repositories 后不删 vendor 和 composer.lock 就运行 install 必然失败
镜像只影响元数据(packages.json)拉取,不影响 composer.lock 里已记录的 dist URL。旧 lock 文件仍指向 packagist.org 或 GitHub API,install 会直接复用,根本不会触发镜像。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 必须执行:
rm -rf vendor composer.lock - 再运行:
composer install(不是update)——只有install会基于当前composer.json+ 镜像配置生成新 lock - 跳过清理,你会看到
file could not be downloaded或日志反复出现packagist.org/p/
验证是否真走镜像不能只看命令输出,要看日志和配置值
执行 composer config -g repo.packagist 输出空、null 或仍是官方地址,说明全局配置根本没写进去;而项目级配置即使写对了,也可能被 repositories 字段的存在彻底屏蔽。
- 查配置本身:
composer config -g repo.packagist必须输出完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 查实际请求:
composer install -vvv 2>&1 | grep -i 'mirrors\.aliyun',日志里必须出现镜像域名 - 快速排查项目干扰:
grep -o '"repositories"' composer.json,只要输出有内容,全局镜像就失效
项目级 repositories 会完全覆盖全局配置且不提示
只要 composer.json 根节点存在 "repositories" 字段(哪怕只是 "repositories": []),Composer 就跳过所有全局镜像逻辑,直接读该字段——这是硬编码行为,不是“优先级更高”。
- CI/CD(如 GitHub Actions)、宝塔、Docker 容器中,
-g配置常因用户权限不同而不可见,项目级配置反而更可靠 - 手动编辑时务必确认
repositories是数组,且{"packagist.org": false}在最前 - 已有私有源时,别用
composer config repo.packagist(不加-g)强行写入——它可能清空整个repositories数组,建议手动维护
最容易被忽略的点:你以为改了配置就生效,其实 composer.lock 里的 dist URL 还锁着旧地址,vendor/ 里还有缓存的包元数据,这两样不清理,镜像永远只是摆设。










