composer graph 不是 composer 内置命令,需安装第三方包 baethon/composer-graph 并配置 graphviz 的 dot 命令;常见报错源于 dot 未入 path 或 vendor 目录缺失;支持 --dev、--filter、--max-depth 等参数优化图表可读性;红色节点、加粗/双向箭头分别表示版本冲突、多路径汇聚与循环依赖。

composer graph 命令为什么直接报错?
因为 composer graph 根本不是 Composer 内置命令。你看到的错误 Command "graph" is not defined 不是配置问题,是官方压根没实现——别在官方文档里白费时间搜这个命令了。
真正能用的 composer graph 来自第三方包 baethon/composer-graph,它依赖系统级的 dot 命令(Graphviz 提供),缺一不可。
- 先装 Graphviz:macOS 用
brew install graphviz,Ubuntu/Debian 用sudo apt install graphviz,Windows 安装时务必勾选「Add Graphviz to the system PATH」 - 再全局安装插件:
composer global require baethon/composer-graph,确认~/.composer/vendor/bin在你的$PATH中 - 运行前检查:
dot -V要能输出版本号,ls vendor/autoload.php要存在——composer graph解析的是已安装状态,不是composer.json的理想声明
生成图时输出为空或报 failed to execute dot?
常见原因是 dot 命令找不到,或者项目环境不完整。这不是 PHP 报错,是系统路径或 vendor 状态问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
failed to execute dot:说明dot不在$PATH。Mac 用户可运行echo $PATH | grep composer和which dot对比路径;Linux/Windows 用户检查 Graphviz 安装后是否重启终端 - 输出为空:大概率
vendor/目录不存在或不全。CI 环境中尤其常见,建议加一步composer install --no-interaction --prefer-dist再执行绘图 - 图里看不到
require-dev包:默认行为。如需包含(比如排查 PHPUnit 引入的旧版 Symfony),加--dev参数
图太密、节点重叠、看不清关键路径?
默认全量渲染会把所有包和边都画出来,100+ 包的项目基本没法肉眼识别。这时候必须靠参数过滤,而不是硬扛。
- 聚焦主干:用
--filter="topthink/*"或--filter="guzzlehttp/guzzle"锁定命名空间或具体包 - 限制深度:加
--max-depth=2避免展开过深的传递依赖,适合快速定位顶层冲突点 - 排除干扰项:用
--exclude="phpunit,phpstan,laravel/pint"手动剔除开发工具链 - 换格式提升可读性:
--format=svg比png更适合放大查看节点文字,但需浏览器打开(双击 .svg 文件可能因 MIME 类型失败)
图里出现红色节点或加粗箭头意味着什么?
颜色和线宽不是装饰,是冲突信号。可视化不是为了好看,是为快速揪出三类硬伤:
- 红色节点:通常是版本协商失败的候选者,比如同一包被不同上游要求互斥版本(
^7.4vs^8.0) - 加粗箭头:代表多条依赖路径汇聚到同一个目标包,这类交汇点就是版本“拉锯战”的发生地
- 双向箭头闭环:实锤循环依赖(A → B → A),必须砍掉其中一端的
require,否则某些 autoloader 行为不可预测 - 同一包多个版本节点并存(如
monolog/monolog:2.12和3.5):说明依赖树未收敛,composer update可能失败或产生意外剪枝
真正难处理的从来不是图怎么画出来,而是图里那些看似微小的红色节点和交叉加粗边——它们背后往往是 platform 配置偏差、replace 规则干扰、或本地 path 仓库导致的解析偏移,这些在文本树里完全隐形。










