composer show --tree 已在 Composer 2.2+ 中被移除,应改用 composer show -t 或安装 composer/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: --tree或Did 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 install或composer update,可能显示空或过时结构 - PHP 版本、扩展(如
ext-zip)、平台配置(platformconfig)会影响哪些包被纳入树中——composer show -t会按当前环境过滤掉不兼容的分支 - 私有仓库或 VCS 包若未正确认证,
composer tree可能卡住或报Could not fetch,而show -t通常只报警告并跳过 - 某些包通过
replace或provide声明虚拟包(如psr/log-implementation),它们不会出现在树里,但实际会被其他包依赖——这点靠树状图看不出,得查composer show --all配合grep










