composer本身无graph或viz命令,所有报错均因官方未实现;show --tree仅为缩进文本,无法渲染图表、识别循环依赖或版本分裂,仅适合单层排查;结构化导出需show --format=json --recursive,或用mablae/composer-dependency-graph一键生成png/svg/html图。

Composer 本身没有 composer graph 或 composer viz 命令,所有报 “Command not defined” 的错误都源于此——不是你装错了,是它根本没实现。
为什么 composer show --tree 不算“导出依赖图”
它只输出缩进文本,不包含节点关系元数据,无法被渲染为矢量图;深层嵌套时人眼无法追踪路径,更识别不出循环依赖或版本分裂。它适合快速排查某一层引用,但不能替代图结构。
- 输出内容不可直接喂给
dot、Mermaid或前端可视化库 - 重复包(如多个路径引入
guzzlehttp/guzzle)会被多次展开,但无标识说明是否同版本 - 不区分
require和require-dev,除非显式加--no-dev
用 composer show --format=json --recursive 导出结构化依赖树
这是最可控的原始数据源,适用于脚本处理或 CI 环境中自动化生成 DOT/SVG。注意它反映的是当前 vendor/ 状态下的解析结果,不是 composer.lock 的快照。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须加
--recursive才展开全部嵌套,否则只返回 root 包的直接依赖 - 默认不含
require-dev,要包含得额外加--dev参数 - 输出中
require字段是字符串数组(如["monolog/monolog": "^2.0"]),需解析键值对才能构建边关系 - 遇到
"self.version"或"dev-main"这类占位符,生成 DOT 前必须替换或过滤,否则dot会报语法错误
用 composer-dependency-graph 插件一键生成 PNG/SVG/HTML
这是本地临时查看最省事的方案,封装了 JSON 解析 + DOT 生成 + dot 调用全流程。插件名是 mablae/composer-dependency-graph(非已废弃的 markuspoerschke 版本)。
- 全局安装:
composer global require mablae/composer-dependency-graph - 生成 PNG:
composer-dependency-graph --format=png --output=deps.png - 加
--dev包含开发依赖;加--filter="laravel/*"可聚焦命名空间 - HTML 模式生成的文件需通过本地服务器打开(
python3 -m http.server 8000),双击会因 CORS 失效
用 composer-unused 生成“实际被代码引用”的依赖图
如果你关心的是运行时真实加载链路(而非 composer.json 声明链路),composer-unused 更准——它扫描 vendor/ 下所有 PHP 文件中的 use、new、class_exists 等调用。
- 安装:
composer global require composer-unused/composer-unused - 导出 DOT:
composer-unused --format=dot > deps.dot - 箭头方向默认是“被依赖”:A → B 表示 B 用了 A;加
--reverse可翻转 - 私有
path类型包默认不扫描,需手动加--scan-path=../my-private-package
真正容易被忽略的是:图的语义取决于数据源。composer show 给你的是声明依赖,composer-unused 给你的是代码级引用,composer.lock 里则根本没有边关系。选哪个,得看你诊断的问题类型——是版本冲突?还是未使用包堆积?还是循环引用卡死安装?










