composer show --root-reqs 仅当未指定包名且配合 show 命令时生效,显示已安装的顶层依赖(非 composer.json 原始约束),不支持 outdated 等其他命令,且需确保 vendor/ 已存在。

composer show --root-reqs 只显示顶层依赖,但默认不生效
这个参数不是“开关式”选项,它必须和 show 命令配合使用,且只在没有指定包名时才起作用。很多人输完 composer show --root-reqs 却看到全量依赖列表,是因为误加了包名或用了其他子命令。
-
composer show --root-reqs✅ 正确:列出composer.json里直接声明的包(不含传递依赖) -
composer show laravel/framework --root-reqs❌ 无效:指定包名后,--root-reqs被忽略,只显示该包信息 -
composer outdated --root-reqs❌ 不支持:该参数仅适用于show,其他命令如outdated、depends不识别
为什么 --root-reqs 不能替代 composer.json 查看?
它输出的是已安装状态下的解析结果,不是原始声明。比如你写了 "monolog/monolog": "^2.0",但实际装的是 2.10.0,show --root-reqs 显示的就是 monolog/monolog 2.10.0 —— 版本号是锁死后的,不是 composer.json 里的约束表达式。
- 要查原始声明,还是得看
composer.json的require字段 -
show --root-reqs对 CI 检查有用:确认“当前环境是否只装了预期的顶层包”,避免意外引入传递依赖 - 它不反映
require-dev,除非显式加--dev参数:composer show --root-reqs --dev
和 composer show --tree 的关键区别在哪
--tree 展开全部依赖树,而 --root-reqs 是它的“第一层快照”。两者目的完全不同:一个查结构,一个查边界。
-
composer show --tree:适合排查版本冲突、理解某包为何被装上 -
composer show --root-reqs:适合审计、发布前确认“没多装不该有的包” - 性能差异明显:
--root-reqs几乎不扫描 vendor,速度极快;--tree要递归读取所有composer.json,大项目可能卡顿
常见误用导致“没反应”或报错
最典型的其实是拼写错误或位置错乱。Composer 对参数顺序敏感,--root-reqs 必须紧贴 show,不能放在末尾或中间夹杂其他 flag。
- ❌
composer show --format=json --root-reqs:部分旧版 Composer 会忽略--root-reqs(v2.2+ 已修复,但 v1.x 仍存在) - ❌
composer show --root-reqs --no-ansi:--no-ansi本身合法,但某些组合下会触发未定义行为,建议单独用--root-reqs - ✅ 安全写法:
composer show --root-reqs或composer show --root-reqs --dev,不混用其他输出控制参数
真正容易被忽略的是:这个参数只对当前 vendor/ 有效。如果 composer install 没跑完、或者 vendor/ 是空的,它会报错 Could not find package,而不是安静地返回空——得先确保依赖已安装到位。










