Composer怎么查看依赖树 Composer怎么分析引用关系【结构】

3次阅读

Composer怎么查看依赖树 Composer怎么分析引用关系【结构】

直接看依赖树:用 composer show --tree 最靠谱

想一眼看清项目里“谁依赖了谁”,composer show --tree 是 Composer 官方最稳定、最直观的命令,不需要插件,也不依赖实验性配置。

  • 必须在含 composer.json 的项目根目录运行,否则报错或输出为空
  • Composer 版本低于 2.0 会提示 Command "show" is not defined,需先执行 composer self-update
  • 默认只展示 require 中的包及其传递依赖,require-dev 里的包不会出现在主树中——除非被某个生产依赖间接拉进来
  • 输出缩进即层级:比如 guzzlehttp/guzzle 下缩进显示 psr/http-client,说明 Guzzle 明确依赖它;若同一包在两处不同缩进出现,大概率存在多路径引入,是版本冲突高发区

查“谁在用这个包”:别混淆 whydepends

composer why vendor/package-name 是查引用源的主力命令;而 composer depends 是 2.4+ 实验功能,默认禁用,且容易漏判——尤其遇到 replaceprovide 或 path 类型仓库时。

  • composer why symfony/http-kernel 会告诉你:是 laravel/framework 要求 ^6.0,才把它装进来
  • -t 参数可展开完整路径:composer why -t symfony/http-kernel,看清从 root 到目标包的每一步约束
  • 如果 depends 没输出,不代表没人用它——可能只是没被直接声明依赖,而是通过 replace 或自动加载逻辑间接使用,此时应优先信 why 或回看 show --tree 全局结构

过滤和聚焦:用对参数才能避免信息过载

全量依赖树动辄几百行,不加限制根本没法读。关键参数不是可选项,而是必选项。

  • --no-dev:排除开发依赖,专注生产链路;很多冲突其实来自 phpunitphpstan 拉进来的旧版组件
  • vendor/package-name(带命名空间):不加包名就扫全量,加了就精准定位某条支线,例如 composer show --tree --no-dev guzzlehttp/guzzle
  • --remote:未安装包也能查依赖,适合安装前评估,如 composer show --remote --tree doctrine/orm
  • 别用 --dev 单独查开发依赖树——它不会过滤掉生产依赖,反而让输出更混乱;真要查 dev 链,用 composer show --tree --dev + 包名更可控

依赖分析不是终点,而是调试起点

看到树 ≠ 解决问题。真正卡住你的,往往是版本约束冲突、平台不匹配或隐式替换,而这些信息藏在树之外。

  • 发现某包有多个版本共存?立刻接一句 composer why-not vendor/package version,验证升级是否可行
  • 怀疑某个旧版组件被锁死?用 composer show --tree 找到它的上游,再对那个上游运行 composer why,逐层上溯
  • composer.lock 才是真实快照,show --tree 反映的是 lock 文件当前状态;如果刚改过 composer.json 但没 install,树不会变
  • 脚本解析 composer.lock 或用 componizer.net 可视化,适合复杂项目快速抓重点,但别替代命令行实时验证

依赖树本身很安静,但你得知道往哪棵树下挖——缩进、包名、版本号、why 输出里的箭头方向,这些细节才是线索真正的落点。

text=ZqhQzanResources