composer show -t 默认不展开依赖树,必须指定包名(如.)且需vendor/存在、composer.lock有效;缩进混乱时应加| less -s或用grep定向筛选。

composer show -t 输出缩进混乱、一眼看不出层级?先确认是否真在“看树”
不是命令失效,是很多人误以为 composer show -t 默认就会展开完整依赖树。它其实只输出顶层包(比如你的项目名或指定的 topthink/framework),后面没缩进 ≠ 命令坏了,而是没满足展开条件:
- vendor/ 目录为空或未生成 ——
composer install或composer update没跑过,show -t就没数据可读 -
composer.lock缺失或损坏 —— 它才是 Composer 实际安装决策的唯一依据,composer.json只是愿望清单 - 漏写了包名:必须带,
.表示当前项目,guzzlehttp/guzzle表示从该包开始向下展开
为什么加了 -t 还是一屏乱码?别硬盯全量输出
依赖深度超 5 层、包数破百后,纯空格缩进的文本树根本没法人工扫读。这不是你终端设置问题,是设计局限:
-
composer show -t .会把所有路径一股脑打出来,包括phpunit/phpunit这类 dev-only 包,它们拉进来的sebastian/exporter等又层层嵌套,直接污染主干路径 - 同名包不同版本(如
psr/log[v1.0.0]和psr/log[v2.0.0])并存时,括号里版本不标颜色、不加前缀,靠肉眼比对极易漏判 - 真正需要的往往不是“全貌”,而是“谁把
monolog/monolog拉成了 v1.23.0?”——这时候全量树只是噪音
用 grep + less 定向切片,比图形化工具更快准
与其等第三方工具加载、渲染、再交互折叠,不如终端里三秒定位:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查某个包被谁引入:
composer show -t . | grep -A 3 -B 3 "monolog/monolog"——-A 3 -B 3显示匹配行上下各 3 行,能看清它是被laravel/framework还是spatie/laravel-ignition拉入的 - 包名必须带斜杠:
"monolog/monolog",写成"monolog"会匹配到monolog-handle或monolog-bundle等无关项 - 输出过长时加
| less -R保留颜色(前提是composer config --global color true已启用) - 想排除 dev 包干扰?把
--no-dev放在-t前:composer show --no-dev -t . | grep "psr/http-client"
依赖树不是越深越好,关键看它是否反映 lock 文件真实解析结果
composer show -t 的价值不在“多全”,而在“多准”——它读的是 vendor/composer/installed.json 和 composer.lock 的联合快照,不是静态扫描 composer.json。
所以当你看到某包出现在树里但实际没被 require,大概率是:replace 规则生效了但残留未清理,或 conflict 条款没触发卸载。此时别纠结树形是否完整,直接用 composer prohibits guzzlehttp/guzzle ^7.0 查阻止升级的具体约束来源,或者用 composer why monolog/monolog 追溯到最上层声明处。树只是现场照片,why 和 prohibits 才是审讯笔录。










