Composer元数据指composer.json根对象中描述性字段,不参与依赖解析但影响Packagist展示,包括name、description、type、keywords、homepage、license、authors、support;其中description必填且≤120字符,name须符合vendor/name小写短横线格式。

composer.json 中的元数据字段到底指哪些?
Composer 元数据不是指 vendor 目录里的缓存文件,而是 composer.json 根对象中除 require、require-dev、autoload 等行为配置外的描述性字段。它不参与依赖解析逻辑,但决定包在 Packagist 上如何被发现、分类和展示。
核心元数据字段包括:name、description、type、keywords、homepage、license、authors、support。其中 description 是必填项(composer validate 会报错),且必须是长度 ≤120 的字符串;name 必须符合 ^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$ 正则,否则 Packagist 拒绝收录。
-
type值为metapackage时,整个包不提供代码,仅靠require触发依赖安装(如laravel/laravel) -
keywords是字符串数组,影响 Packagist 搜索权重,但不会被 Composer 运行时读取 -
support中的issues或sourceURL 若格式非法(如缺协议头),composer validate不报错,但 Packagist 解析失败
config 节点不是元数据,但它控制元数据处理行为
config 是项目级运行时策略区,不属于元数据范畴,但直接影响元数据如何被加载或压缩。比如 package-versions 配置决定 vendor/composer/installed.php 是否生成、含哪些字段;设为 "minimal" 时,该文件体积可减少 60%+,但旧版 ocramius/package-versions 无法读取。
常见误用是把 github-oauth 写进项目 composer.json 的 config 里——这会被 Composer 忽略,必须用 composer config -g github-oauth.github.com <token></token> 设置全局凭据。
-
platform属于 config,但会“固化”元数据:一旦设了"php": "8.1.0",composer install就按这个版本解析require中的 PHP 约束,与当前运行环境无关 -
sort-packages为true时,composer require会重排require字段顺序(按字母升序),但不改变description等元数据字段顺序 -
audit.ignore可屏蔽 CVE 提示,但忽略后仍会在composer audit --format=json输出中标记为"ignored": true
元数据压缩与扩展:metadata-minifier 如何介入?
composer/metadata-minifier 库不修改 composer.json 结构,而是对 Composer 运行时生成的元数据快照(如 vendor/composer/installed.json)做无损压缩。它只处理 JSON 键名缩写(如 name → n)、移除空字段、合并重复值,不影响 composer install 行为。
该库本身无配置入口,使用时需手动调用 MetadataMinifier::minify() 方法传入原始 JSON 字符串。它不读取 composer.json 的任何字段,也不受 config 控制——所以你在 config 里设 "preferred-install": "dist",对它的输入输出毫无影响。
- 压缩后文件不可直接被 Composer 读取,仅适用于传输或存档场景(如 CI 构建产物瘦身)
- 调用
expand()方法可还原为标准格式,但还原结果与原始installed.json的字段顺序可能不同 - 若项目用了
metapackage,其require中的包在压缩后依然保留完整依赖链,不会被扁平化
验证元数据是否生效的三个关键命令
别只靠眼睛看 composer.json ——很多元数据问题要到 Packagist 页面或锁文件里才暴露。最有效的验证方式是组合执行以下命令:
-
composer validate:检查description是否缺失、name是否合规、JSON 语法是否合法 -
composer show --all:列出所有已解析的元数据(含继承自依赖包的),确认type和keywords是否被正确识别 -
composer config --list | grep -E "(platform|package-versions)":快速确认影响元数据生成的 config 项是否按预期生效(注意:它不显示description等纯元数据字段)
最容易被忽略的是:修改 description 后不推送到 Packagist,Packagist 页面就不会更新;而 composer show 显示的仍是本地 composer.json 内容,跟远程无关。


















