Composer 2.2+ 废弃 repo.packagist,必须改用 repositories.packagist.org(顶层键)或 repositories 数组形式,并确保 URL 以 / 结尾、禁用 packagist.org、清缓存及重生成 composer.lock。

Composer 2.2+ 的配置结构变更已不可逆,旧版 repo.packagist 写法会被静默忽略;而 CHANGELOG.md 对 Composer 完全透明——它只认 version 和 Git tag,不解析、不校验、不读取。
composer.json 里 repositories 配置为什么突然失效
不是镜像地址错了,是键名被 Composer 2.2+ 废弃了。你还在用 repo.packagist?它现在连警告都不报,直接跳过,回退到 https://packagist.org。
-
repositories.packagist.org是顶层键,必须写在composer.json根对象下,不能嵌套进repositories数组里 - 数组形式也行:
"repositories": [{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}],但必须显式禁用官方源:{"packagist.org": false}放在第一位 - URL 必须以
/结尾,否则会拼出/composerpackages.json导致 404 - 改完后不删
composer.lock就跑composer install,它照着 lock 里硬编码的旧dist.url去请求,根本不会走新配置
私有源返回 Invalid package information 怎么定位
这不是网络或权限问题,是私有源返回的 packages.json 元数据不符合 Composer 2.x 要求——特别是 dist.type 字段。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 用
curl -s https://your-private-repo/packages.json | grep -A 5 'dist.*type'检查实际返回值,确认是"zip"或"tar",不是"pack"或空 - Satis 用户必须升级到 2.0+,并在
satis.json中加"archive": {"format": "zip"} - 改完源配置后,必须运行
composer clear-cache+composer update --no-install验证元数据能否正常拉取,否则composer install会在后续阶段崩
CHANGELOG.md 写得再详细,Composer 也不会看一眼
它只靠 composer.json 的 version 字段或 Git tag 解析版本号。所谓“记录变更”,纯属开发者协作规范,和 Composer 运行逻辑零关联。
- 别把
CHANGELOG.md当作版本控制依据:某次修复没出现在日志里,不代表没发布;日志写了但没打 tag,Composer 就装不到 - 必须和 Git tag 严格对齐,比如发布
v3.2.1,CHANGELOG 里就得有对应标题段落,且所有条目描述的是可观察行为(如HttpClient::send() 默认超时从 30s 降为 10s) - 格式直接采用 Keep a Changelog,别自己设计结构——Laravel、Symfony 等主流包都按这个来,工具链也只认它
最常被忽略的一点:Composer 2.x 解析 composer.lock 时会校验字段合法性,1.x 生成的 lock 文件可能含 content-hash 结构差异或插件元数据,导致 install 直接失败。遇到卡住或崩溃,先删 lock 文件,再清缓存,别急着调镜像。

















