keywords 仅影响 Packagist 搜索排序权重,不决定是否被索引;须为小写无空格 ASCII 词、限 5 个、置于 composer.json 根级,修改后需手动触发同步。

keywords 字段只影响 Packagist 搜索的匹配权重,不决定是否被索引
Packagist 会收录所有合法 composer.json 的包,无论有没有 keywords。但搜索时,带匹配关键词的包会被排得更靠前——前提是这些词确实出现在用户搜索 query 中,且和包的其他元数据(如 name、description)形成协同信号。
实操建议:
-
keywords应为小写、无空格的通用技术词,比如"laravel"、"middleware"、"psr-14",避免自造词或项目专属缩写 - 最多填 5 个,超过部分 Packagist 不读取(实际解析逻辑截断到第 5 个)
- 不要堆砌同义词,比如
"auth"、"authentication"、"login"—— Packagist 搜索不支持模糊 / 同义扩展,只做精确子串匹配 - 若包同时支持 Laravel 和 Symfony,两个都写;但别写
"php"这类泛到没意义的词,它对排序毫无帮助
keywords 必须写在根级 composer.json 里,不能放在 autoload 或 require 下
常见错误是把 keywords 塞进 autoload 或当成了某个依赖的配置项。它只能是 composer.json 最外层的键,和 name、description 并列。
正确写法示例:
{"name": "acme/http-client", "description": "A lightweight PSR-18 client", "keywords": ["psr-18", "http", "client", "guzzle"], "require": {……} }
容易踩的坑:
- 拼错字段名,比如写成
keyword(少 s)或key_words—— Composer 不报错,但 Packagist 完全忽略 - 用中文或特殊符号,如
" 缓存 "、"JWT-token"—— Packagist 搜索目前只对 ASCII 关键词生效 - 值不是字符串数组,比如写成
"keywords": "http client"(字符串而非数组)—— 格式非法,整个字段被丢弃
修改 keywords 后需手动触发 Packagist 同步,不会自动更新
很多人改完 composer.json 就以为完了,其实 Packagist 不会轮询你的仓库。必须显式触发刷新,否则搜索结果还是旧的。
怎么做:
- 登录 Packagist.org,进入你的包页面,点
Update按钮(右上角) - 或者用 GitHub/GitLab Webhook(推荐):在 Packagist 的包设置页开启
Automatic updates,并确保仓库的 push 事件能打到 Packagist - 如果用了私有 Packagist 实例,确认其 webhook 配置和权限没卡住
注意:同步有延迟,通常 30 秒内完成,但偶尔因队列积压要等几分钟。别刚点完就去搜,容易误判失败。
keywords 对 Packagist 搜索的影响弱于 name 和 description
如果你的 name 是 acme/laravel-cache,description 里写了“Laravel cache driver for Redis Cluster”,那即使 keywords 一个不填,搜“laravel cache redis”也大概率排第一。反过来,光靠堆 keywords 拉不动排名。
所以优先级其实是:
- 确保
name包含核心场景词(如 laravel、symfony、psr) - 写清楚、带关键词的
description(Packagist 会全文分词) - 再补 3–5 个精准
keywords作补充信号
最常被忽略的一点:Packagist 搜索不识别版本号、PHP 扩展名(如 ext-json)、或 Composer 命令名(如 composer install)——这些词塞进 keywords 完全无效。