Composer包元数据是写在composer.json和composer.lock中的结构化字段,核心包括name(vendor/package格式,推导PSR-4命名空间)、description(≤120字符纯文本,Packagist强制校验)、type(影响分类与安装路径,如library/project)、keywords(影响搜索排序)、license/authors/homepage(缺失致“incomplete package”);config、scripts、autoload不属于元数据。

Composer 包元数据不是抽象概念,而是真实写在 composer.json 和 composer.lock 里的结构化字段集合——它直接决定包能不能被安装、被找到、被自动加载。
composer.json 中哪些字段算“元数据”?
元数据是描述包本身的信息,不是配置行为的指令。以下字段属于核心元数据:
-
name:必须为vendor/package格式,全小写、短横线分隔;它不光是名字,还推导 PSR-4 命名空间(如acme/http-client→AcmeHttpClient) -
description:纯文本字符串,≤120 字符;Packagist 强制校验,空值会导致包无法同步,composer require找不到包 -
type:影响 Packagist 分类和安装逻辑,填错会触发 CI 失败;合法值包括"library"(默认)、"project"、"metapackage" -
keywords:字符串数组,影响搜索排序但无语法校验;填["psr-7", "http", "guzzle"]有效,填["php", "tool"]等同于没填 -
license、authors、homepage:虽非强制,但缺失会让 Packagist 拒绝收录或显示“incomplete package”
注意:config、scripts、autoload 不属于元数据——它们控制行为,不描述包本身。
description 字段为什么总出问题?
它看起来最简单,却是发布失败最常见的原因。常见错误现象包括:
- Packagist 页面提示 “This package is not available on Packagist.org”,点进去显示 “Missing description”
-
composer validate通过,但composer require vendor/name报 “Package not found” - 手动提交到 Packagist 后卡在 “Processing…” —— 实际后台日志是 description 校验失败
根本原因不是语法错,而是语义失效:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 写成 “一个基于 Laravel 的 UUID 工具” → Packagist 不知道你提供的是命令、trait 还是 Facade
- 超长(比如 156 字符)→ 被截断,
composer show只显示前 80 字左右,关键信息丢失 - 含 Markdown 或换行符 → JSON 解析可能不报错,但 Packagist 拒绝渲染
正确写法示例:"description": "Generate and validate ULID and UUID v4 with zero framework dependencies"
name 字段写错会引发 autoload 失败
这不是 warning,是 runtime error,且错误提示完全不提 name。现象是:
- 类文件存在、
autoload配置看着也对,但运行时报Class AcmeHttpClientClient not found - 实际
composer.json里写的是"name": "acme/http-client",而autoload写成了"MyTool\Core\": "src/"
原因在于 Composer 用 name 推导根命名空间时严格按规则转换:acme/http-client → AcmeHttpClient(短横线变大驼峰,斜杠变反斜杠)。如果你的 autoload 命名空间首字母大小写不一致,或用了下划线,就彻底对不上。
本地改过 name 后,必须删掉 vendor/ 并重装,否则旧的 autoload 文件仍保留错误映射。
真正容易被忽略的点是:元数据字段之间有隐式耦合。比如 name 错了,autoload 就白配;description 空了,整个包就进不了 Packagist 生态——它不参与依赖解析,却卡死发布流程。这些字段不是“可填可不填的说明”,而是 Composer 生态运转的硬性契约。

















