composer list 不是依赖分析命令,它仅列出可用命令及描述,与依赖树无关;真正用于依赖建模的只有三个稳定命令:composer show -t .、composer show --format=json --recursive 和 composer show --who。

composer list 不是依赖分析命令,别用它查依赖关系
composer list 只列出所有可用命令及其简短描述,不输出任何包、版本或依赖信息。它本质是 CLI 帮助系统,和依赖树完全无关。常见误操作是执行 composer list | grep show 以为能筛出依赖相关命令——这只会匹配到命令名里的字符串,毫无结构化数据价值。
真正用于依赖建模的入口只有三个稳定命令:composer show -t .(已安装树)、composer show --format=json --recursive(结构化原始数据)、composer show --who(反向引用)。其他如 composer tree、composer depends、composer export 全部不存在或已被弃用。
用 composer show --format=json --recursive 生成可脚本处理的依赖快照
这是自动化构建中最可控的数据源:它不依赖终端宽度、不混淆缩进层级、不含 ANSI 颜色码,且字段明确。但必须注意几个关键点:
- 必须加
--recursive,否则只返回 root 包的直接依赖 - 默认不含
require-dev,要包含得显式加--dev参数 - 输出中
require字段是字符串数组(如["monolog/monolog": "^2.0"]),需 JSON 解析后提取键值对才能构建边关系 - 遇到
"self.version"或"dev-main"这类占位符,必须在生成 DOT 前替换为实际版本号,否则dot会报语法错误 - 该命令读取的是
vendor/和composer.lock的当前状态,不是composer.json的声明理想态
为什么不能直接用 composer show -t . 的文本输出做自动化解析
composer show -t . 的缩进文本看着像树,但根本不是标准树形格式:没有节点 ID、没有父子关系标识、重复包无唯一标识、版本号混在括号里且位置不固定。写正则去解析它极易漏判或错位,尤其当某包被 5 个不同路径引入时,缩进换行错位会让空格计数失效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
更麻烦的是终端宽度影响输出格式:less -S 能缓解显示问题,但无法修复数据结构缺陷。CI 环境中若未设置 $COLUMNS,composer show -t . 可能截断行尾导致依赖丢失。所以它只适合人工快速扫描,不适合喂给 Python/Node.js 脚本做图建模。
真正能进 CI 流水线的依赖图生成链路
可靠方案是三步闭环:先用 composer show --format=json --recursive --no-dev 导出 JSON;再用轻量脚本(比如 20 行 Python)解析并生成标准 DOT 文件;最后调用系统 dot 命令转 PNG/SVG。整个过程不依赖插件、不触发 Composer Solver、不修改 vendor/,纯读取快照。
如果想省事又接受插件依赖,mablae/composer-dependency-graph 是目前唯一维护活跃、兼容 Composer 2.9.6 的方案。但要注意:--filter="laravel/*" 这类参数只过滤输出节点,不影响底层解析逻辑;HTML 模式生成的文件必须通过本地 HTTP 服务打开,双击会因浏览器 CORS 策略白屏。
复杂点在于虚拟包(如 psr/log-implementation)和 replace 声明——它们不会出现在 JSON 输出的 require 字段里,但会影响实际加载行为。这类关系只能靠 composer show -t . 全局扫视 + 手动比对 composer.json 中的 provide 字段确认。










