用 composer show --tree -s | less -r 可清晰查看依赖树,-s 压缩显示包名与版本,less 支持翻页和搜索;反向依赖需用 composer depends --tree 包名;autoload 未生效或需 dump-autoload;多版本共存需检查实际安装与类加载覆盖。

composer show --tree 看不清依赖层级?用这个参数组合
默认 composer show --tree 输出太宽,终端一屏刷满,根本分不清谁依赖谁。核心问题不是命令不存在,而是输出没做截断和缩进控制。
- 加
-s(short)参数能压缩显示,只保留包名+版本,跳过描述,大幅提升可读性:composer show --tree -s - 配合
less分页查看更稳妥:composer show --tree -s | less -R,支持上下翻、搜索/monolog - 如果项目用了大量 dev 依赖,
--dev会把测试工具链也拉进来,干扰主干依赖判断;非必要不加
为什么 vendor/autoload.php 里找不到某个类,但 composer show 显示已安装?
这通常不是依赖没装,而是 autoloading 配置没生效——Composer 只负责加载,不保证自动注册所有命名空间。
- 检查该包的
composer.json是否声明了"autoload"(如"psr-4"或"classmap"),没声明就无法被自动加载 - 运行
composer dump-autoload强制重生成 autoload 文件,尤其在手动改过composer.json后容易漏掉这步 - 某些包(比如纯脚本工具)只提供 bin 命令,不提供类加载,
composer show能查到,但代码里new不了
composer depends 查不到反向依赖?注意作用域限制
composer depends 默认只查当前项目直接 require 的包,不会穿透到子依赖的子依赖。想查“谁让 monolog/monolog 进来的”,得明确指定范围。
- 查直接依赖:
composer depends monolog/monolog - 查全部路径(含间接依赖):
composer depends --tree monolog/monolog - 如果返回空,先确认包名拼写是否完全匹配(包括大小写),
composer show列出的才是真实名称 - 私有包或 path repository 里的依赖,
depends可能无法解析 autoload 信息,得结合composer.lock手动追踪
依赖树里出现同一包多个版本?别急着删,先看是否真冲突
Composer 允许同一包不同版本共存(通过不同的 autoload namespace 或 classmap 路径),但实际运行时可能因类加载顺序出问题。
- 用
composer show -t | grep "package-name"快速定位所有出现位置,注意版本号和父依赖链 - 如果两个版本被不同分支 require,且没有版本约束冲突,Composer 会选一个满足所有条件的版本合并安装——此时树里显示多版本只是“曾考虑过”,最终只装一个
- 真正危险的是
class not found或method not exists报错后发现是低版本类被高版本 autoload 覆盖了,这时得用composer require --update-with-dependencies强制对齐
composer.json 修改、require 命令执行、甚至平台配置(PHP 版本、扩展)实时变化。每次怀疑依赖关系异常,优先重跑 composer update --dry-run 看计划变更,比盯着树状图猜更可靠。










