composer如何使用–root-reqs参数_composer仅显示根依赖变更【聚焦】

1次阅读

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

composer如何使用–root-reqs参数_composer仅显示根依赖变更【聚焦】

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,其他命令如 outdateddepends 不识别

为什么 –root-reqs 不能替代 composer.json 查看?

它输出的是已安装状态下的解析结果,不是原始声明。比如你写了 "monolog/monolog": "^2.0",但实际装的是 2.10.0show --root-reqs 显示的就是 monolog/monolog 2.10.0 —— 版本号是锁死后的,不是 composer.json 里的约束表达式。

  • 要查原始声明,还是得看 composer.jsonrequire 字段
  • 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-reqscomposer show --root-reqs --dev,不混用其他输出控制参数

真正容易被忽略的是:这个参数只对当前 vendor/ 有效。如果 composer install 没跑完、或者 vendor/ 是空的,它会报错 Could not find package,而不是安静地返回空——得先确保依赖已安装到位。

text=ZqhQzanResources