keywords 字段位于 composer.json 根层级,是可选的字符串数组,如 ["php", "composer", "utility"];不可为空、null 或单字符串,且影响 Packagist 搜索而非本地安装。

keywords 字段写在哪、长什么样
keywords 是 composer.json 根层级的可选字段,必须是字符串数组,不能是空数组、null 或单个字符串。
正确写法示例:
{
"name": "myvendor/my-package",
"description": "A demo package",
"keywords": ["php", "composer", "utility", "string"]
}
常见错误包括:
- 写成对象:
"keywords": {"php": true} - 漏掉中括号:
"keywords": "php, utility" - 包含空字符串:
"keywords": ["php", ""](Packagist 会忽略整个字段) - 使用中文关键词(虽不报错,但搜索效果极差,Packagist 检索基本不识别)
为什么 keywords 不影响本地 install,只影响 Packagist 搜索
composer install 和 composer update 完全不读取或校验 keywords 字段;它既不参与依赖解析,也不影响 autoloading 或脚本执行。
它的唯一作用是:当包被 composer publish(实际是 git push 后触发 Packagist webhook)同步到 Packagist 时,供其搜索引擎建立倒排索引。
这意味着:
- 本地开发改了
keywords,不重新发布,Packagist 上看不到更新 - 关键词拼错(如
"laravel"写成"larval"),用户在 Packagist 搜不到你的包 - 关键词过于宽泛(如
"php"、"tool")反而稀释曝光,建议聚焦场景词,例如"csv-parser"、"rate-limit-middleware"
怎么选关键词才真能被搜到
Packagist 的搜索权重偏向「具体功能」+「技术栈组合」,而不是通用语言名。优先顺序建议:
- 核心功能动词+名词:
"generate-qrcode"、"validate-iban" - 框架/生态绑定词:
"laravel-8"、"symfony-bundle"(注意用短横线,不用下划线或驼峰) - 协议或标准:
"oauth2-server"、"psr-14" - 避免单独用
"php"、"library"、"package"—— 这些几乎无区分度
可以反向验证:去 Packagist 搜你想要的关键词,看头部结果是否和你的包定位一致。如果前几页全是知名包,说明这个词太热;如果根本没结果,说明可能拼错或太冷门。
keywords 和其他元数据字段的关系
keywords 独立于 description、type、support 等字段,但协同影响搜索点击率:
-
description是搜索结果摘要,必须包含至少一个keywords中的词,否则用户扫一眼可能跳过 -
type(如"library"、"wordpress-plugin")会影响 Packagist 分类页展示,但不参与关键词搜索匹配 -
keywords中的词如果出现在README.md首屏,也会轻微提升 SEO 权重(对 Google 搜索有用,对 Packagist 无效)
真正容易被忽略的一点:Packagist 每次同步只抓取最新 composer.json 的 keywords,不会合并历史版本。所以删掉某个词,它就彻底从搜索索引里消失了 —— 没有“渐进式下线”这回事。











