composer show --tree 以空格缩进隐式表示依赖层级,每两级缩进对应一层嵌套,但缩进数非稳定坐标,不可编程解析;需用 composer why 或 composer depends 精准溯源,或导出 JSON 递归解析 requires 字段。

没有“装配树坐标”这个概念,Composer 依赖树的层级结构由缩进空格数隐式表达,不是可编程对齐的坐标系
composer show --tree 的缩进不是坐标,而是依赖深度的视觉映射
每两级缩进(通常为 2 或 4 个空格)代表一层依赖嵌套,例如:
your/project
└── laravel/framework
└── monolog/monolog
└── psr/log
这里 psr/log 前有 6 级空格,说明它是三级依赖(project → framework → monolog → psr/log),但这个“6”不是可读取、可计算的坐标值,只是终端渲染结果。
- 不同终端或
less配置下空格数可能被压缩或展开,无法稳定解析 - Composer 不提供 API 或 JSON 字段返回“层级索引”或“树坐标”,
--format=json输出里只有name、version、requires,没有depth或path字段 - 所谓“对齐层级结构”,实际是人为阅读时靠缩进判断父子关系,不是程序能自动对齐的布局任务
想定位某个包在树中的“位置”,别数空格,用 composer why 或 composer depends
数缩进容易错,尤其当同名包多版本并存(如 symfony/console v5.4.0 和 v6.2.0)时,仅靠空格看不出谁是谁的子节点。
-
composer why vendor/package直接告诉你谁直接拉入了它,以及满足的约束(如^3.0) -
composer depends vendor/package列出所有依赖它的包,含间接依赖路径(从 root 开始的完整链) - 两者都绕过缩进解析,基于
vendor/composer/installed.json和composer.lock的真实关系数据,比人工对齐可靠得多
需要结构化层级数据?导出 JSON 后自己解析 requires 字段
如果真要程序化处理依赖层级(比如写 CI 检查脚本),composer tree --format=json(Composer ≥ 2.5)是唯一结构化出口:
{
"name": "your/project",
"version": "dev-main",
"requires": {
"laravel/framework": "^10.0"
}
}
注意:requires 是扁平键值对,不递归嵌套;要构建完整树,得递归查每个 value 对应包的 requires 字段——这正是 Composer 内部做的,你无需重复造轮子。
- 不要尝试用正则匹配缩进去“还原坐标”,
composer show --tree | grep只适合人眼快速扫描 - JSON 输出不含平台依赖(如
ext-json),如需包含,加--platform参数 - 生产环境排查时,优先确认
vendor/下对应包目录是否存在,比任何树形输出都直接
真正难的不是“对齐层级”,而是理解为什么某个旧版包被拖进来——那通常藏在 composer.json 的间接约束或 replace 声明里,缩进再整齐也看不到这点。











