composer 官方从未实现 composer graph 命令,报错“command not defined”是源码层面缺失所致;构建机上唯一可靠方案是 composer show --recursive --format=json --no-dev 导出结构化数据,经脚本清洗(过滤 dev-*/self.version 等非法值)后转为 dot,再用 dot -tpng 渲染。

官方没有 composer graph 命令,构建机上想出图必须绕过“一键命令”幻想,用 composer show --recursive --format=json + Graphviz 才可靠。
为什么 composer graph 在构建机上必然失败
运行就报 Command "graph" is not defined,不是环境没配好,是 Composer 源码里压根没实现这个命令。所有文档或博客里写的 composer graph 或 composer viz 都是误导——它在任何环境(包括构建机)下都不存在。别浪费时间查 PATH、重装 Composer 或升级到 2.9.6,版本再新也没用。
构建机上唯一可控的导出路径:JSON → DOT → PNG
构建机通常无图形界面、无交互终端,必须脚本化生成。核心是两步:先导出结构化数据,再交给 dot 渲染。关键点不在“怎么画”,而在“导出的数据能不能被 dot 安全解析”:
-
composer show --recursive --format=json --no-dev是起点:加--recursive才展开全部嵌套依赖;加--no-dev避免 phpunit 等污染生产图谱 - 输出里的
"version": "dev-master"、"self.version"、"dev-develop"必须过滤掉——dot会直接报语法错误,无法继续 - 渲染命令要显式指定格式:
dot -Tpng composer-deps.dot -o deps.png;不加-Tpng默认输出 plain text,不是图 - 确保构建机已安装 Graphviz:
dot -V能输出版本号;Ubuntu/Debian 用apt install graphviz,Alpine 用apk add graphviz
构建机常见卡点与绕过方式
不是“图没出来”,而是中间某环断了。典型现象和应对:
-
dot: command not found:Graphviz 未安装,不是 PHP 或 Composer 问题;Docker 构建镜像中需提前RUN apt install -y graphviz - 图太大、渲染超时或内存溢出:加
--max-depth=3参数限制层级(需配合脚本解析 JSON 后裁剪),或改用-Tsvg降低渲染压力 - JSON 输出为空或只有一两个包:确认
composer install已执行且vendor/存在;composer show读的是vendor/目录,不是composer.lock;若构建流程跳过了install,先补上 - 依赖名含空格或特殊字符导致 DOT 解析失败:导出前用脚本对
name字段做转义,例如把foo/bar替换为"foo/bar"(DOT 要求节点名带引号)
真正难的不是画图,是让 JSON 数据干净到能喂给 dot ——构建机没人工干预机会,任何占位符、空值、非法字符都会让整个流程静默失败。











