composer search 命令在 Composer 2.2+ 中已被官方永久移除,因 Packagist 自2022年底关闭搜索 API;替代方案是直接调用 https://packagist.org/search.json?q=关键词,配合 curl 和 jq 使用。

composer search 命令在 Composer 2.2+ 中已彻底不可用,不是配置问题,而是 Packagist 官方永久关闭了搜索 API —— 直接执行会报错 Command "search" is not defined。
为什么 composer search 会报错
这不是你装错了、没更新、镜像源不对,也不是命令拼写有空格(比如 composersearch)—— 它是被官方主动移除的。Packagist 自 2022 年底起下线了全文搜索后端服务,Composer 2.2(2023 年发布)起正式删除该命令。哪怕你降级到 Composer 1.x,返回结果也极简、无分页、不支持过滤,实际不可靠。
- 执行
composer search log或composer search laravel都会明确提示错误 -
--only-name等参数根本不存在于任何可用版本中,旧教程里写的全是过时信息 - 第三方脚本如
composersearch早已失效,且无法对接当前 Packagist JSON 接口
用 curl 直调 Packagist 搜索接口
Packagist 的公开 JSON 搜索接口仍在运行,响应快、结构清晰,是目前最轻量可靠的替代方案:
- 基础命令:
curl -s "https://packagist.org/search.json?q=cache"(把cache换成你要的关键词,如pdf、redis、auth) - 加
jq格式化人话输出:curl -s "https://packagist.org/search.json?q=log" | jq '.results[] | {name: .name, desc: .description}' - 没装
jq?至少加| head -n 20避免刷屏 - 国内用户建议加重试:
curl --retry 2 -s "https://packagist.org/search.json?q=queue"
注意:该接口只返回前 10 条结果,不支持分页;想多看几条,只能换词重试(比如试 redis client 或 redis library)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
搜到包名后必须立刻验证是否真能用
网页或 API 返回“存在”,不等于它能在你项目里装得上。真实约束只有本地命令能暴露:
- 查包是否存在、是否活跃:
composer show monolog/monolog—— 成功返回说明未废弃(abandoned字段会标出)、有稳定版本;失败则明确提示Package not found - 模拟安装,提前发现硬性问题:
composer require --dry-run phpunit/phpunit:^9—— 能暴露 PHP 版本不兼容、依赖冲突、缺失扩展(如ext-gmp)等 - 如果你配了阿里云等镜像源,
composer show会走镜像,比curl更快、更准,且直接反映你本地环境的真实可用性
别跳过这步:复制网页上的包名容易带空格或斜杠错误(如 symfony/ console),composer show 会立刻报错,帮你止损。
深度评估一个包是否适合你
Packagist 页面不显示关键事实,仅靠搜索结果做判断风险很高:
- 打开 GitHub 仓库看
Issues是否有近期回复、Recent Commits是否活跃(别信 stars 数) - 确认它是否支持你的 PHP 版本 —— 网站显示所有历史 tag,但最新版可能只支持 PHP 8.1,而你用的是 8.3
- 检查
abandoned标签(如ircmaxell/password-compat已弃用多年,但搜password仍可能排前面) - 点进包页看
require字段,尤其留意php和ext-xxx依赖,某些 Docker 镜像默认不启用ext-gmp,装了也跑不起来
真正要敲进 composer require 的,从来不是搜索结果里的名字,而是经过 show + --dry-run + GitHub 三重验证后的那个包名。

















