composer show --root-reqs 用于列出当前项目中实际安装的顶层依赖包(即 composer.json 中 require 字段声明且已安装的包),仅支持纯文本输出,不支持 JSON 格式,且要求 Composer 2.2+ 版本。

composer show --root-reqs 只显示根依赖包
直接运行 composer show --root-reqs 即可列出当前项目 composer.json 中声明的顶层依赖(即你手动执行 composer require xxx 添加的包),不包含任何递归依赖。这是最常用也最可靠的用法。
注意:该参数从 Composer 2.2 开始引入,低于此版本会报错 Unrecognized option: --root-reqs;若用的是旧版 Composer,请先升级或改用其他方式模拟。
为什么不用 composer show 或 composer show --tree
composer show 默认列出所有已安装包(含传递依赖),数量动辄上百,根本无法聚焦“你自己写了哪些 require”;composer show --tree 虽能看依赖结构,但默认从 root 包展开,信息冗余且层级深,不适合快速核对根依赖清单。
常见误操作:composer show --root-reqs --format=json 看似合理,但实际不生效——--root-reqs 不支持 JSON 输出格式,强行加会静默忽略该 flag,返回全部包的 JSON。只支持纯文本输出。
配合 grep 或脚本提取特定信息
如果只想看包名和版本号(去掉描述),可用 shell 管道处理:
composer show --root-reqs | awk '{print $1 " " $2}'
或者导出为简单列表供 CI 检查:
- 检查是否包含某关键包:
composer show --root-reqs | grep -q "^monolog/monolog" - 统计根依赖数量:
composer show --root-reqs | wc -l - 排除 dev-only 依赖(需额外过滤):
composer show --root-reqs | grep -v "require-dev"—— 注意这不可靠,因为输出不标记来源字段,更稳妥的方式是解析composer.json本身
替代方案:直接读取 composer.json 更准确
当需要 100% 确保“仅你写的 require”,绕过 Composer 安装状态干扰(比如某些包被删了但 composer.json 还留着),直接解析 JSON 更可靠:
jq -r 'keys_unsorted[] as $k | "\($k) \(.[$k])"' composer.json | grep -E "^require\>" | sed 's/^require\.//'
不过这就脱离了 Composer 命令范畴。日常运维中,composer show --root-reqs 已足够轻量、直观,唯一要记住的是:它反映的是「当前 lock 文件里实际安装的根依赖」,不是 composer.json 的原始快照——如果执行过 composer update xxx 但没 commit lock,结果可能和同事看到的不一致。










