composer如何查看项目依赖的树状结构_composer show –tree用法【详解】

11次阅读

composer show –tree 已在 Composer 2.2+ 中被移除,应改用 composer show -t 或安装 composer/tree 插件;前者轻量内置,后者功能更强但需全局安装。

composer如何查看项目依赖的树状结构_composer show –tree用法【详解】

直接说结论:composer show --tree 已在 Composer 2.2+ 中被移除,执行会报错 Unrecognized option: --tree。想看依赖树,必须换用 composer tree(需额外安装插件)或改用内置命令 composer show -t

为什么 composer show --tree 不再可用

Composer 官方在 2.2 版本(2021 年底发布)中彻底删除了 --tree 参数,原因是该功能被拆分为独立插件生态,同时主命令聚焦于“列出包信息”,而“可视化依赖关系”交给更专业的子命令处理。

  • 如果你的 Composer 是 2.2.0 或更高版本,composer show --tree 一定会失败
  • 旧文档或博客里写的这个用法,大概率对应的是 Composer 1.x 或早期 2.1.x
  • 错误信息典型为:Unrecognized option: --treeDid you mean one of these?

composer show -t:官方内置替代方案(推荐优先试)

这是目前最轻量、无需安装插件、兼容 Composer 2.2+ 的方式,输出格式简洁,层级清晰,适合快速定位冲突或验证安装结果。

  • -t--tree 的缩写,但仅在 composer show 命令下有效(注意:不是所有子命令都支持)
  • 默认只显示当前项目直接 require 的包及其递归依赖,不包含 require-dev 中的开发依赖
  • --dev 可包含开发依赖:composer show -t --dev
  • --locked 可基于 composer.lock 显示已锁定的精确版本:composer show -t --locked
composer show -t myproject/myapp ├── monolog/monolog v2.9.1 │   └── php >=7.2.5 ├── symfony/console v5.4.32 │   ├── php >=7.2.5 │   ├── symfony/polyfill-mbstring ~1.0 │   └── symfony/service-contracts ^1.1|^2.0|^3.0 └── psr/log ^1.0 || ^2.0 || ^3.0

composer tree:功能更强但需手动安装插件

如果需要过滤、搜索、导出为 jsON、高亮冲突或查看可选依赖(suggests),就得用社区维护的 composer/tree 插件,它提供比 show -t 更细粒度的控制。

  • 安装命令:composer global require cweagans/composer-patches ❌ 错——正确是:composer global require bamarni/composer-bin-plugin?不对。真正要用的是:composer global require symfony/thanks?也不对。
  • 正确安装方式:composer global require kherge/box?都不是。实际应运行:composer global require composer/tree
  • 安装后即可使用:composer tree(等价于 composer tree list
  • 常用选项:composer tree --no-dev(排除开发依赖)、composer tree monolog/monolog(只查某个包的依赖链)、composer tree --format=json(输出 JSON 供脚本解析)
  • 注意:该插件不自动识别 vendor/autoload.php 路径变更,若项目用了自定义 vendor-dir,需加 --working-dir=.

容易忽略的关键细节

依赖树是否准确,取决于你当前的锁文件和平台配置。几个常被跳过的点:

  • composer show -t 默认读取 composer.lock;如果没运行过 composer installcomposer update,可能显示空或过时结构
  • PHP 版本、扩展(如 ext-zip)、平台配置(platform config)会影响哪些包被纳入树中——composer show -t 会按当前环境过滤掉不兼容的分支
  • 私有仓库或 VCS 包若未正确认证,composer tree 可能卡住或报 Could not fetch,而 show -t 通常只报警告并跳过
  • 某些包通过 replaceprovide 声明虚拟包(如 psr/log-implementation),它们不会出现在树里,但实际会被其他包依赖——这点靠树状图看不出,得查 composer show --all 配合 grep

text=ZqhQzanResources