composer 2.2+ 要求 repositories 字段必须为顶层对象(如{"packagist": {...}}),数组格式([] 或 [{}])会被静默忽略;须先改为{}再执行配置命令,并删 vendor 和 composer.lock 后重装。

composer.json里repositories字段必须是对象,不是数组
很多人以为repositories写成数组就能叠加多个源,结果镜像根本没生效。Composer 2.2+ 要求它必须是顶层对象(如{"packagist": {...}}),否则会静默忽略整个字段,连警告都不给。
常见错误现象:"repositories": []或"repositories": [{}]——命令composer config repo.packagist composer https://...会直接失败;"repositories": {"type": "vcs", "url": "..."}这种单个对象也不合法,必须是键值对结构。
- 正确做法:先手动把
composer.json里的"repositories": []改成"repositories": {},再执行配置命令 - 如果已有私有 VCS 源,应确保它被包裹在
"repositories"对象内,例如"repositories": {"packagist": {...}, "my-gitlab": {...}} - 别漏掉
"packagist.org": false——它必须作为根级字段(不在repositories里),否则 Composer 仍会偷偷回连官方源
镜像URL末尾斜杠规则,全局和项目级相反
同一个镜像地址,composer config -g repo.packagist要求末尾带/,而composer config repo.packagist(项目级)却严禁带/。写错一个字符,就静默 fallback 到https://packagist.org,且不报错。
错误示例:https://mirrors.aliyun.com/composer/用于全局配置✅,但放进composer.json的url字段就❌,会拼出/composer/packages.json导致404;反过来,https://mirrors.aliyun.com/composer用于项目级✅,但全局配置会失效。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 验证方式:运行
composer config -g repo.packagist,输出必须是完整 JSON,形如{"type": "composer", "url": "https://..."} - 项目级配置后,检查
composer.json中是否生成了"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer"}(无尾部斜杠) - curl 测试最准:
curl -I https://mirrors.aliyun.com/composer/packages.json返回HTTP/2 200才算镜像通
改完配置不删vendor和composer.lock,等于没改
composer.lock文件里硬编码了每个包的dist.url和哈希值,它完全不关心你当前配的是哪个镜像。只要不删它,composer install就永远从旧地址拉包——问题不会报错,只会悄悄走错源。
典型表现:日志里明明看到GET https://mirrors.aliyun.com/composer/...,但实际下载请求发到了https://api.github.com/...,就是因为lock文件里还存着 GitHub 的 dist URL。
- 必须执行:
rm -rf vendor composer.lock(Windows 用rd /s/q vendor && del composer.lock) - 之后只跑
composer install(不是update),让 Composer 从头解析依赖并生成适配新镜像的 lock 文件 - CI/CD 脚本里务必加这一步,否则缓存的
vendor会让镜像配置彻底失效
COMPOSER_AUTH比全局config更可靠
团队里要统一 GitHub token 或私有仓库认证,别用composer config --global github-oauth——它写进~/.composer/auth.json,权限错乱、CI 不可见、多用户环境读不到。
真正稳定的做法是用环境变量注入:COMPOSER_AUTH='{"github-oauth": {"github.com": "xxx"}}'。PHP 进程启动时自动读取,不依赖家目录,不污染全局配置,CI 可通过 secrets 安全注入。
- 本地开发可写入
.env并由脚本加载,避免硬编码到 Git - 宝塔或 Docker 中,直接在容器环境变量里设置,绕过
~/.composer路径不可见问题 - 若误用
sudo composer config --global写入,后续普通用户运行会因权限不足卡死,且ls -ld ~/.composer显示 owner 是root
composer.lock不记录镜像源,只记录 dist URL;而 Composer 下载阶段完全不查repositories配置,只认 lock 文件里的地址。换源却不删 lock,所有配置都只是幻觉。










