Composer 无内置 graph 命令,可靠方案只有两类:一是用 composer show --recursive --format=json 导出依赖树后转 DOT 并用 Graphviz 渲染;二是安装 markuspoerschke/composer-dependency-graph 插件快速生成 PNG 或 HTML 图。

composer graph 命令根本不存在
Composer 本身不提供生成依赖关系图的内置命令,composer graph 或 composer viz 都会报错:「Command "graph" is not defined」。这不是你配置错了,是官方没实现——别再翻文档找这个命令了。
真正能用的方案只有两类:第三方插件(需额外安装)或导出数据后用外部工具渲染。选哪个取决于你是否需要频繁生成、是否接受 PHP 外部依赖(比如 Graphviz)。
用 graphviz + composer-show-tree 导出 DOT 文件
这是目前最轻量、可控性最强的方式,适合 CI 环境或需要脚本化生成的场景。核心思路是:先用 composer show --tree 获取层级结构,再用 Python/PHP 脚本转成 DOT 格式,最后调用 dot 渲染为 PNG/SVG。
-
composer show --tree输出的是带缩进的文本,不是标准 JSON,直接解析易出错;推荐改用composer show --format=json,它返回完整依赖树(含require和require-dev分离字段) - 注意
composer show --format=json默认只显示 root 包的直接依赖;加--recursive才展开全部嵌套(但会变慢,且可能因循环依赖卡住) - 生成 DOT 时,务必过滤掉
dev-*分支版本和self.version这类占位符,否则dot会报语法错误 - 执行
dot -Tpng composer-deps.dot -o deps.png前,确认系统已装 Graphviz:dot -V要能输出版本号
用 composer-dependency-graph 插件快速出图
这是最省事的方案,适合本地临时查看。插件名是 markuspoerschke/composer-dependency-graph,它封装了 DOT 生成和调用逻辑,还支持 HTML 交互式视图。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 全局安装:
composer global require markuspoerschke/composer-dependency-graph,确保~/.composer/vendor/bin在$PATH中 - 在项目根目录运行:
composer-dependency-graph --format=png --output=deps.png;若报Class 'Graph' not found,说明插件依赖的graphp/graph没装全,可尝试加--no-plugins后重试 - HTML 模式(
--format=html)生成的页面依赖本地 Web 服务器打开,直接双击.html文件会因 CORS 失效;建议用python3 -m http.server 8000启一个临时服务 - 该插件默认忽略
require-dev,如需包含,加--with-dev参数
为什么不能直接用 composer.lock 解析画图
composer.lock 记录的是最终解析后的扁平化包列表(含哈希、source 类型),但它**不保存依赖指向关系**——比如 monolog/monolog 是被谁 require 的,在 lock 文件里完全看不出来。强行从 lock 反推依赖路径,结果不可靠,尤其在存在多版本共存(如 A→B v1, C→B v2)时会漏边或连错。
真正反映“谁依赖谁”的元数据,只存在于 composer.json 的 require 字段和 Composer 安装时内存中的依赖图谱中。所以所有靠谱的可视化工具,底层都走 composer show --recursive --format=json 或直接 hook Composer 的 RepositorySet 实例,而不是读 lock 文件。
生成图之后,记得检查有没有意外出现的 dev-main 或 dev-develop 边,这类分支依赖往往意味着某包未打稳定版 tag,容易在下次 composer update 时突然断开连接——图上看着漂亮,实际是颗雷。

















