description 和 keywords 必须位于 composer.json 顶层对象中;description 为≤120字符的字符串,keywords 为小写、无空格、连字符分隔的字符串数组;name 格式为 vendor/name(全小写、单斜杠);packagist 同步依赖 tag、webhook 或手动更新,非实时。

composer.json 里 description 和 keywords 写在哪
这两个字段必须直接写在 composer.json 的顶层对象里,不是放在 autoload、require 或其他子对象下。Packagist 解析时只认根级字段,嵌套了就完全忽略。
常见错误是误塞进 extra 或 scripts 里,或者加了多余缩进导致 JSON 格式错误——后者会直接让 composer validate 报错:JSON decode error: Syntax error。
-
description是纯字符串,建议控制在 120 字以内,Packagist 前端只显示前两行 -
keywords必须是字符串数组,每个词小写、无空格、用连字符分隔(如"laravel-package"),别写成"Laravel Package"或["laravel", "package"]—— 后者虽合法但搜索权重低 - 字段名大小写敏感:
Description或DESCRIPTION都无效
packagist.org 同步后 description 不更新
Packagist 不实时拉取你仓库的 composer.json,它只在你手动触发同步、或配置了 GitHub/GitLab Webhook 后,从 tag 或默认分支(通常是 main)读取最新内容。改完 composer.json 直接 push 到 main 分支,不打 tag,Packagist 可能几天都不刷新。
- 最稳的方式:打一个新 tag(如
v1.2.1),然后去 Packagist 页面点Update - 如果用了 Webhook,确认回调地址是
https://packagist.org/api/github(GitHub)或对应 GitLab 地址,且仓库设置里 Webhook 状态为active - 检查 Packagist 项目页右上角的
Last updated时间,比你 push 时间晚几小时属正常;超过 24 小时没更新,大概率是 Webhook 失败或 JSON 校验不通过
name 字段格式影响 packagist 展示和安装体验
name 不只是标识符,它决定包在 Packagist 上的 URL 路径和用户 composer require 的写法。格式必须是 vendor/name,中间一个斜杠,全部小写,只含字母、数字、连字符和下划线。
- 错误示例:
"my-project"(缺 vendor)、"MyVendor/MyPackage"(含大写)、"vendor/name/subname"(多于一个斜杠)—— 这些都会导致 Packagist 拒绝同步 - vendor 名应与你的 GitHub 用户名或组织名一致,否则用户
composer require vendor/name时可能找不到包(Packagist 默认按 vendor 名做命名空间过滤) - 如果改过
name,旧包不会自动重定向,已安装的老版本不受影响,但新用户只能搜到新 name
keywords 没出现在搜索结果里
Packagist 的搜索对 keywords 权重不高,真正起作用的是 name、description 开头部分、以及被多少其他包依赖。单纯堆砌关键词没用,反而显得 spammy。
- 选 3–5 个最精准的词,比如写 Laravel 包就用
"laravel"、"service-provider"、"configurable",别写"php"、"tool"这种泛词 - 避免重复:如果
name已含laravel-redis-cache,keywords里再写"laravel"、"redis"、"cache"就足够,不用补"laravel-redis" - 别指望靠 keywords 排到首页——有 10+ 个活跃 star、被至少 3 个中等体量项目 require,比填满 keywords 更有效
元数据这事,填对位置比填得多重要;同步机制比本地改得勤更重要;名字和描述能不能让人一眼看懂,比关键词数量更影响实际点击率。











