composer show 不加参数时默认只列已安装包;支持前缀匹配但不支持模糊搜索,需用 --all 配合 grep 等工具筛选,且无原生 -s/--search 选项。

composer show 不加参数时默认只列已安装包
很多人输 composer show 后发现输出一堆包,但根本找不到自己要查的那个——因为默认行为是列出 当前项目已安装的所有包,不支持模糊搜索或分页。它不是包管理器的「搜索引擎」,而是「已装清单打印机」。
实操建议:
- 想快速定位某个包?必须补全或至少输入包名前缀,比如
composer show monolog或composer show symfony/http-foundation - 包名拼错、大小写不对、漏了 vendor 名(如把
laravel/framework写成framework)都会返回「Package not found」 - 如果只记得关键词(比如“cache”),得先用
composer show --all列出全局所有可用包,再配合grep:composer show --all | grep -i cache
composer show --all 的结果不含版本详情
composer show --all 看起来很全,但它只显示包名和简短描述,不显示版本号、依赖关系或是否稳定。你没法靠它判断哪个版本兼容 PHP 8.2,也没法一眼看出 guzzlehttp/guzzle 的最新稳定版是不是 v7.x。
实操建议:
- 确认具体版本信息,必须指定完整包名:
composer show guzzlehttp/guzzle -
--all结果受repositories配置影响——如果你在composer.json里加了私有源,--all会把它们也拉进来;没加的话,就只有 Packagist 官方源的包 - 输出过长时别硬翻,直接管道进
less:composer show --all | less,按/keyword搜索更可靠
搜索私有包或未安装包时容易忽略 --repository 参数
团队私有包通常注册在内部 Satis 或 Toran Proxy 上,composer show 默认只查本地已安装或 Packagist 的包。如果你没在 composer.json 里声明对应 repositories,或者没用 --repository 显式指定地址,composer show 就完全看不到那些包。
实操建议:
- 查私有包前,先确认该源已配置在
composer.json的repositories下;否则临时加:composer show --repository https://your-satis.example.com/packages.json myorg/private-lib -
--repository后的 URL 必须是合法的 Composer 包仓库根 JSON 地址,不是 Git URL 或网页地址;填错会报Could not parse version constraint这类误导性错误 - 私有包若未 require 过,
composer show只能查到名字和描述,无法显示其依赖树——依赖信息需等composer require后才完整载入
用 -s 或 --search 实际上并不存在
不少开发者凭经验敲 composer show -s "log" 或 composer show --search=cache,结果得到 Unknown option: s 或 Unrecognized option: search。Composer 的 show 命令从没实现过原生搜索开关,所有「搜索」都得靠外部工具辅助完成。
实操建议:
- 别试任何带
-s、--search、--find的变体,它们都不生效 - 真要批量筛包名,优先用 shell 组合:
composer show --all | awk '{print $1}' | grep -E '^(monolog|psr)' | xargs -I{} composer show {} 2>/dev/null - 长期高频检索建议写个简单脚本封装,比如
cs log自动跑composer show --all | grep -i log,比记命令快得多
真正卡住人的地方往往不是命令本身,而是误以为 composer show 能像 npm search 那样模糊匹配。它不联网实时查,不建索引,也不缓存远程元数据——所有输出都基于本地 lock 文件或已知仓库快照。想快,就得接受它是个「精准查表工具」,而不是搜索引擎。










