composer 官方无 graph/viz 命令,composer show --tree 已弃用;唯一原生命令是 composer show -t(需指定包名如 .),插件推荐 markuspoerschke/composer-dependency-graph,图解重点排查循环依赖、多版本冲突与孤立包。

Composer 本身不提供 composer graph 或 composer viz 命令,所有报错 Command "graph" is not defined 都不是你配置错了,是官方压根没实现——别再翻文档找这个命令了。
为什么 composer show --tree 不再可用
Composer 2.2+ 已弃用 composer show --tree,运行会直接报错。当前唯一稳定、无需插件的原生命令是 composer show -t,但必须带包名参数(如 . 或具体包名),否则提示 Not enough arguments。
-
composer show -t .:点号代表当前项目,输出全部已安装依赖树 -
composer show -t guzzlehttp/guzzle:只展开指定包的下游依赖链,避免全量干扰 -
--no-dev必须放在-t前面,例如composer show --no-dev -t .,否则 dev 包仍混入 - 缩进仅表示 require 声明层级,不是加载顺序,也不是重要性;同一包在不同缩进反复出现,大概率被多个上游分别引入
- 终端宽度不足会导致缩进换行错位,建议管道进
less -S:composer show --no-dev -t . | less -S
用 markuspoerschke/composer-dependency-graph 快速出图
这是目前最省事、兼容 Composer 2.9.6 的插件方案,支持 PNG/SVG/HTML 输出,封装了 DOT 生成和 dot 调用逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 全局安装:
composer global require markuspoerschke/composer-dependency-graph,确保~/.composer/vendor/bin在$PATH中 - 基础命令:
composer-dependency-graph --format=png --output=deps.png - 私有镜像必须显式传参:
--repository=https://your-satis.example.com/(结尾斜杠不能少) - 含
require-dev?加--with-dev参数;否则默认只画生产依赖 - HTML 模式需本地服务打开:
python3 -m http.server 8000,双击.html文件会因 CORS 失效
用 composer show --format=json --recursive + Graphviz 脚本化生成
适合 CI/CD 或需要可控渲染的场景,不依赖 PHP 插件生命周期,但要求系统已装 Graphviz。
- 验证 Graphviz:
dot -V必须能输出版本号;Mac 用brew install graphviz,Ubuntu/Debian 用apt install graphviz - 导出完整依赖树:
composer show --format=json --recursive > deps.json(注意:不加--recursive只返回直接依赖) - 生成 DOT 时务必过滤
dev-分支和self.version占位符,否则dot报语法错误 - 调用渲染:
dot -Tpng composer-deps.dot -o deps.png;图太大字体小?加-Gfontsize=10 - CI 环境中 vendor 必须存在且完整,否则插件静默失败或输出空图
图出来之后,重点盯这三处硬伤
可视化不是为了好看,是为快速定位真实运行风险:
- 箭头双向闭环(A → B → A)→ 实锤循环依赖,必须砍掉其中一端的
require - 同一包出现多个版本节点(如
guzzlehttp/guzzle:7.4和7.8并存)→ 版本冲突高发区,立刻查composer why guzzlehttp/guzzle - 某包节点孤立无连接,但项目里又实际用了它的类 → 可能被
replace或provide隐藏,composer depends查不到,得结合phpdg做静态扫描
真正容易被忽略的是:所有依赖图(无论文本还是图形)都只反映当前 vendor/ 状态,不校验平台约束(如 ext-json)、不体现 autoload 注册顺序,也不代表实际加载行为。










