composer怎么查看包的依赖关系_composer depends命令【技巧】

4次阅读

composer depends 命令在 2.4+ 版本中为实验功能,默认关闭,需手动启用;推荐使用 composer why(支持 –tree)或 composer show –who 查依赖,结果基于 composer.lock,稳定可靠。

composer怎么查看包的依赖关系_composer depends命令【技巧】

composer depends 命令根本不存在(除非你手动启用实验功能)

执行 composer depends monolog/monolog 报错 “Command ‘depends’ is not defined” 是正常的——Composer 官方在 2.3 及更早版本中压根没这个命令。它最早出现在 2.4+,但属于实验性功能,默认关闭。

  • 想用 depends,必须先在项目根目录运行:composer config experimental.show-depends true
  • 该配置只对当前项目生效;加 --global 全局启用不推荐,因实验功能可能随时变更或移除
  • 即使启用了,depends 也只查「直接 require 了该包」的顶层包,不会递归显示 A→B→C 这类间接链路
  • 它不区分 requirerequire-dev,也不告诉你约束版本(比如是 "^2.0" 还是 "~1.8"

真正能用的原生命令是 composer whycomposer show --who

composer why vendor/package-name 是最可靠、最常用的方式,它基于 composer.lock 回溯安装原因,结果稳定、语义清晰。

  • 不加参数:只显示直接依赖者,例如 laravel/framework requires monolog/monolog (^2.0)
  • --tree:展开完整依赖路径,看清它是怎么被“带进来”的:laravel/framework → symfony/console → psr/log → monolog/monolog
  • composer show --who vendor/package-name(≥2.2)功能类似,但更精简,且不支持 --tree,适合脚本快速提取包名
  • 注意:why--who 都只看已安装的包(vendor/ + composer.lock),如果刚改完 composer.jsoninstallupdate,结果会滞后

查不到?先确认三件事:包是否已安装、是否被声明、是否拼写正确

composer why 返回空,不代表没人用它——大概率是本地根本没装这个包,或者它只是某个包的 require-dev 依赖,而你当前没装开发依赖(比如忘了 --with-all-dependencies)。

  • 运行 composer show 看列表里有没有目标包;没有就先 composer require vendor/package-name --devcomposer install
  • 检查 composer.json 中的拼写:大小写、斜杠方向(monolog/monolog 不是 monologmonolog)、有无多余空格
  • why 不扫描测试文件或 autoload-dev 中的手动 require,那些属于运行时逻辑,不在 Composer 依赖图内
  • 若包被 replaceprovides 声明替代(如 psr/logsymfony/polyfill-psr-log 提供),why 也不会显示原始引用者

需要跨项目查或批量分析?别硬扛,换工具

想查公司所有代码库中哪些项目还在用 guzzlehttp/guzzle:6.*,或者生成 html 依赖图谱——composer why 就力不从心了。

  • 全局扫描:用 shell 脚本遍历项目目录,逐个执行 composer why guzzlehttp/guzzle 2>/dev/NULL | head -n1 收集结果
  • 结构化输出:配合 composer show --format=json | jq 解析,比如提取所有 require 了某包的项目名
  • 可视化依赖:装 composer global require graphp/graphviz + composer global require bamarni/composer-bin-plugin,再用 composer-dependency-graph 生成 svg
  • 深度审计:用社区插件 composer global require jakub-onderka/composer-depchecker,支持未使用包检测、HTML 报告、JSON 导出

依赖关系不是静态树,而是 SAT 求解器算出来的约束满足结果;看到的“谁依赖谁”,永远受限于当前 composer.lock 的快照和平台配置。别信直觉,多跑一遍 why --tree,再看一眼 composer.lock 里的 version 字段,比猜强得多。

text=ZqhQzanResources