composer show -t 缩进仅表示 require 层级,不反映实际版本或冲突;应结合 composer show、--no-dev 过滤及 composer-dependency-graph 生成交互式 html 图排查依赖问题。

composer show -t 输出太乱,根本没法定位冲突?
别硬数缩进——composer show -t 的缩进只表示 require 声明层级,不反映实际安装版本、不标冲突、不折叠重复路径。同一包(比如 guzzlehttp/guzzle)在 2 级和 5 级都出现,你得手动比对括号里的版本号(如 [7.4.0] 和 [7.8.1]),终端一换行,缩进就错位,根本没法信。
真正有用的判断依据只有两个:composer show vendor/package 查实际安装版,composer show -t . 加 --no-dev(注意必须写在 -t 前面)过滤干扰项。但超过 200 行后,grep 也救不了你——这时候必须切到图。
用 composer-dependency-graph 生成可交互 HTML 图
这是目前最轻量、开箱即用的方案:不依赖 Graphviz,纯 HTML + JS,支持拖拽、缩放、悬停看版本和来源,适合日常快速排查。
- 安装:
composer require --dev kylekatarnls/composer-dependency-graph - 生成:
./vendor/bin/composer-dependency-graph,默认输出graph.html - 聚焦分析:
./vendor/bin/composer-dependency-graph --filter="laravel/*"只画 Laravel 生态节点,避免图过密 - 发现双向箭头闭环?立刻查
composer.json,实锤循环依赖
它读的是 composer.lock 实时快照,刚改完 composer.json 必须先 composer update 同步锁文件,否则新包不会出现在图里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
要 SVG/PNG 静态图?必须配 Graphviz
dot command not found 不是 Composer 错误,是系统缺 Graphviz 二进制。Mac 用户跑 brew install graphviz,Ubuntu/Debian 用 apt install graphviz,Windows 则要去官网下载并勾选「Add Graphviz to the system PATH」。
- 全局装工具:
composer global require bitexpert/composer-visualize,确保~/.composer/vendor/bin在$PATH中 - 导出 PNG:
composer visualize --format=png --output=deps.png - 控制复杂度:
--max-depth=2限制层级,--dev才包含require-dev(默认忽略)
图里箭头方向是「被依赖」:A → B 意味着 B 用了 A。这点反直觉,但所有 Graphviz 渲染工具(包括 composer-unused --format=dot)都遵循这个逻辑,别按中文语序读反。
反向查“谁依赖了这个包”?别信 composer depends
composer depends 是实验功能,默认关闭,遇到 provide、replace 或 path 类型仓库时容易漏判。可靠做法是:
- 直接查已安装包:
composer show --who psr/log,加--no-dev过滤开发依赖 - 溯源到你自己项目:
composer why --tree monolog/monolog,末尾出现your-project-name dev-main才算确认是你写的 - 私有包或
"type": "path"引入的本地包,composer-unused默认跳过,得手动加--scan-path=/path/to/private
真正麻烦的不是工具选错,而是图里缺了关键节点——比如没指定 --scan-path 导致私有模块消失,或者忘了 --dev 让 CI 环境下测试工具链的冲突完全不可见。










