composer search 匹配包名(vendor/name)、description 和 keywords 三个字段,采用子串包含匹配而非全文或语义检索,多关键词为隐式“与”关系,且不支持布尔运算符。

composer search 匹配哪些字段?
它只查包名(vendor/name)、description 和 keywords 三个字段,不索引 README、源码、标签页或 Packagist 页面上的“Related packages”——搜 logging 找不到 monolog/monolog,因为它的 name 是 monolog,description 写的是 “Sends your logs to files, sockets, inboxes, databases and numerous web services”,没出现 logging 这个词。
实际匹配逻辑是子串包含,不是分词或语义匹配:
-
composer search http→ 匹配guzzlehttp/guzzle、php-http/httplug、symfony/http-foundation -
composer search laravel/scout→ 能命中,但composer search "laravel scout"会拆成两个词,反而漏掉 -
composer search cache redis→ 同时出现在同一字段中才返回,比如spatie/laravel-redis-cache的 description 含 “redis” 和 “cache”
多关键词是“与”还是“或”关系?
是隐式“与”:所有词必须共现于同一个包的 name、description 或 keywords 中。这不是布尔搜索,也没有优先级,更不支持 OR、NOT 或括号分组。
常见误判点:
- 搜
composer search pdf generator可能返回空,因为很多 PDF 库的description写的是 “A library for creating PDFs”,不含 “generator” - 搜
composer search monolog error能中,是因为 monolog 的 keywords 包含error,但error单独搜几乎不出结果——它不在任何主流包的 name 或 description 前半段 - 别堆超过 3 个词,比如
composer search laravel redis cache driver,实际有效词只剩 1–2 个,反而筛过头
--only-name 和 -t 参数怎么用才不白用?
--only-name 是防干扰的关键开关:默认模式下,搜 laravel 会把 symfony/framework-bundle(description 含 “Laravel-like”)也拉进来;加了 --only-name 就只扫 name 字段,结果干净得多。
-t(--type)能过滤掉大量噪音:
-
composer search http -t library排除laravel/laravel这类type: project模板 -
composer search mail -t metapackage可快速定位像laravel/framework这种聚合包,但它本身不提供功能,得再查它 require 的真实组件 - 不加
-t时,composer search queue可能混入yiisoft/yii2-queue(type: library)和laravel/horizon(type: metapackage),二者安装方式和维护模型完全不同
为什么搜得到却装不上?常见断点在哪
最常卡在三处:大小写、私有源、abandoned 状态。
大小写敏感只发生在 require 阶段,但 search 不报错——搜出 Monolog/Monolog(首字母大写)是假象,实际包名是 monolog/monolog,composer require Monolog/Monolog 直接失败。
私有包必须提前配置 repositories,否则 composer search 根本不查它;临时补救可用 --repository,但值必须是合法 JSON URL,填 Git 地址会报 Could not parse version constraint。
abandoned 包仍会出现在搜索结果里,Packagist 页面标黄提醒 “This package is abandoned”,但命令行无任何提示——得手动点进去看,或用 composer show --all vendor/package 观察是否长期停在 dev-master 或 1.x。
真正容易被忽略的是 PHP 版本兼容性:搜索结果从不显示 "php": "^8.0" 这类约束,而它直接决定你能不能 composer install 成功。这一步只能去 Packagist 页面翻 require 段,不能跳。


















