composer show -t 的缩进不反映真实依赖层级,仅表示 require 声明嵌套;判断实际依赖应使用 composer show vendor/package 和 composer show -t . --no-dev,超200行需借助 composer-dependency-graph 生成可交互html图,其箭头方向为「被依赖」(a→b 表示 b 依赖 a)。

composer show -t 输出的缩进不是真实依赖层级
它只表示 require 声明时的嵌套写法,不反映实际安装版本、不标冲突、不折叠重复路径。同一包(比如 guzzlehttp/guzzle)在 2 级和 5 级都出现,你得手动比对括号里的版本号(如 [7.4.0] 和 [7.8.1]),终端一换行,缩进就错位,根本没法信。
真正有用的判断依据只有两个:composer show vendor/package 查实际安装版,composer show -t . --no-dev(注意 --no-dev 必须写在 -t 后面)过滤开发依赖干扰项。但超过 200 行后,grep 也救不了你——这时候必须切到图。
composer graph 命令根本不存在
运行 composer graph 或 composer viz 一定会报错:Command "graph" is not defined。这不是你环境没配好,是 Composer 源码里压根没这功能。
可行方案只有两个:
- 用
composer show --recursive --format=json导出结构化数据 + Graphviz 渲染 - 装第三方插件
markuspoerschke/composer-dependency-graph直接生成 HTML/PNG 图
别再搜官方文档找 graph 命令了,它不在那里。
用 composer-dependency-graph 快速生成可交互 HTML 图
这是目前最轻量、开箱即用的方案:不依赖 Graphviz,纯 HTML + JS,支持拖拽、缩放、悬停看版本和来源,适合日常快速排查。
安装:composer require --dev kylekatarnls/composer-dependency-graph
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
生成:./vendor/bin/composer-dependency-graph,默认输出 graph.html
聚焦分析:./vendor/bin/composer-dependency-graph --filter="laravel/*" 只画 Laravel 生态节点,避免图过密
注意:composer-dependency-graph 读的是 composer.lock 实时快照,刚改完 composer.json 必须先 composer update 同步锁文件,否则新包不会出现在图里。
反向查“谁依赖了这个包”别信 composer depends
composer depends 是实验功能,默认关闭,且在 provide、replace 或 path 类型仓库下容易漏判。
可靠做法是直接查已安装包:composer show --who psr/log,加 --no-dev 过滤开发依赖。
如果 composer show --who 返回空,大概率是该包根本没被安装,或者只存在于 require-dev 中而你当前没装开发依赖——不是命令失效,是状态不匹配。
图里箭头方向是「被依赖」:A → B 意味着 B 用了 A。这点反直觉,但所有 Graphviz 渲染工具(包括 composer-unused --format=dot)都遵循这个逻辑,别按中文语序读反。










