packages.json 是 Packagist 元数据的根索引快照,由镜像站同步生成并缓存在 ~/.composer/cache/repo/ 下,它不是 Composer 配置文件或手动编辑清单,而是包含所有包名、最新稳定版本映射及 provider-*.json 路径的 JSON 文件。

packages.json 是什么,不是什么
它不是 Composer 的配置文件,也不是你手动编辑的清单;它是 Packagist 元数据的根索引快照,由镜像站同步生成并缓存在本地 ~/.composer/cache/repo/ 下。Composer 在解析依赖时,第一件事就是读这个文件——里面没有具体包代码,只有所有已知包的名称、最新稳定版本映射,以及指向 provider-*.json 的路径列表。
反序列化失败常见原因和验证方式
所谓“反序列化失败”,实际多是 json_decode() 报错或 Composer 日志里出现 JSON decode error,根本原因几乎都出在镜像源本身:
- 镜像同步中断导致
packages.json文件不完整(比如只下载了一半,末尾缺}) - URL 拼接错误:全局镜像配置漏了末尾
/,结果请求的是https://mirrors.aliyun.com/composerpackages.json(404 后返回 HTML 页面,json_decode()直接炸) - 镜像站临时返回 502 或空响应,Composer 缓存了损坏内容,后续所有
composer update都复用这个坏 JSON
验证是否真坏了:运行 curl -s https://mirrors.aliyun.com/composer/packages.json | head -n 20,看开头是不是 {"packages":{;再用 php -r "json_decode(file_get_contents('path/to/packages.json')); var_dump(json_last_error_msg());" 直接测。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
项目级 repositories 覆盖后,packages.json 从哪来
只要 composer.json 里有 repositories 字段,Composer 就完全忽略 composer config -g repo.packagist,哪怕你配了阿里云镜像也没用。此时 packages.json 的来源取决于你写的第一个 repositories 条目:
- 写的是
{"type":"composer","url":"https://mirrors.ustc.edu.cn/composer/"}→ 读中科大镜像的/packages.json - 写的是
{"packagist.org": false}却没跟镜像条目 → Composer 会 fallback 到官方https://repo.packagist.org/packages.json,但国内大概率超时卡死 - 写了多个源但没设
"packagist.org": false→ 第一个源失败(如 500)就直接报错,不会试第二个,更不会去读它的packages.json
为什么清 composer clear-cache 不管用
因为 composer clear-cache 只删 ~/.composer/cache/files/(ZIP 包),而 packages.json 存在 ~/.composer/cache/repo/ 下,路径名是 URL 转义后的目录(如 https---mirrors.aliyun.com-composer)。必须手动删对应目录,或用 composer update --refresh(≥2.5 才支持)强制重拉元数据。
容易被忽略的一点:删完缓存后,不触发一次 composer update 或 composer show,那个目录不会自动重建——你以为清干净了,其实下次命令还是读旧缓存。

















