composer无内置依赖图命令,所有出图方案均需外部工具;最快定位冲突是用composer show --no-dev -t .,注意参数顺序、点号作用及缩进判断。

Composer 没有内置的依赖关系图命令,composer graph 或 composer viz 一定会报错 “Command not defined”——这不是你漏装插件,是官方压根没实现这个功能。所有能出图的方案,都必须绕过 Composer 原生命令,靠外部工具或数据导出。
怎么用 composer show --tree 快速定位冲突源头
它不是图,但却是最轻量、最稳定、无需安装任何额外工具的路径排查入口。关键在参数顺序和过滤逻辑:
-
composer show --no-dev -t .:必须把--no-dev放在-t前面,否则无效;点号.表示当前项目,不加会只显示 root 的直接依赖 - 看到同一包(如
symfony/console)在不同缩进层级反复出现,大概率是被多个上游包分别引入,此时要立刻查版本是否一致:composer show symfony/console - 终端宽度不够会导致缩进错位,建议用
composer show --no-dev -t . | less -S,避免换行干扰层级判断 - 如果某包只在
require-dev下存在(比如phpunit/phpunit),它不会出现在默认输出里——但可能通过nikic/php-parser等间接拉入旧版symfony/polyfill,这就是冲突常见隐性来源
为什么 composer depends --tree 经常查不到真实闭环
这个命令本质是静态扫描 composer.json 中的 require 字段,对 replace、provide、path 类型仓库支持极差,且默认关闭(2.4+ 版本需手动启用)。更麻烦的是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 输出中箭头方向是 “被谁依赖”:
monolog/monolog ← guzzlehttp/guzzle表示 Guzzle 用了 Monolog,不是反过来 - 遇到循环依赖时,它可能直接卡住或跳过部分节点,因为依赖解析器根本没走到那一步
- 真正可靠的闭环诊断方式只有:
composer depends --tree vendor/a+composer depends --tree vendor/b交叉比对,看是否形成a ← b ← a路径 - 如果
composer depends vendor/a返回 “Package not found”,说明该包没进composer.lock——先删vendor/和composer.lock,再跑composer update --dry-run观察第一步失败点
用 composer show --format=json --recursive 导出数据生成 DOT 图
这是 CI/CD 或脚本化分析唯一可控的路径,但要注意几个硬性限制:
-
composer show --format=json默认只返回 root 的直接依赖,必须加--recursive才展开全量,但深度嵌套 + 循环依赖时可能卡死 - 输出 JSON 中的
require和require-dev是分离字段,生成 DOT 前得手动过滤掉dev-master、self.version、带斜杠别名(如myorg/core[dev-feature]),否则dot会报syntax error in line X -
dot -Tpng composer-deps.dot -o deps.png前,务必确认系统已装 Graphviz:dot -V要能输出版本;Mac 用户用brew install graphviz,Ubuntu/Debian 用apt install graphviz - 生成的图里,节点无版本号、无颜色区分、边无权重——它只反映声明依赖,不反映实际加载行为或运行时耦合强度
用 markuspoerschke/composer-dependency-graph 快速出 HTML/PNG
这是本地临时排查最省事的方案,但它封装了太多细节,容易掩盖问题本质:
- 全局安装后,
composer graph --filename=deps.png --format=png可直接出图;但若报Class 'Graph' not found,说明插件依赖的graphp/graph没装全,可加--no-plugins后重试 - HTML 模式生成的页面依赖本地 Web 服务打开,双击
index.html会因 CORS 失效;推荐用python3 -m http.server 8000临时起服务 - 默认不包含
require-dev,如需查看测试工具链影响,得加--with-dev(v2.0+ 支持) - 图太密看不清?可用
--max-depth=2限制层级,或--filter="laravel/*"只画特定命名空间——但这会丢失跨生态的隐性耦合线索
真正难的从来不是生成一张图,而是图里那些重叠节点、交叉边、孤立子图——它们往往对应着你代码里没拆干净的公共逻辑、测试与生产混用的自动加载规则、或者被 replace 掩盖的真实版本冲突。别迷信可视化,先确保 composer show --no-dev -t . 能读通,再考虑要不要上图。










