composer如何查看包的依赖树?(depends与prohibits命令实战)

2次阅读

composer的depends和prohibits命令均基于composer.lock文件解析,非实时读取composer.json;包名须严格匹配vendor/name格式,全局包、未声明包或平台限制均不可查。

composer如何查看包的依赖树?(depends与prohibits命令实战)

composer depends 查不到包?先确认包名是否精确匹配

执行 composer depends vendor/package-name 时返回“Package not found”,大概率不是命令错了,而是包名没写对——Composer 默认只认 vendor/name 格式,不接受别名、缩写或带 .git 后缀的 URL。比如你想查谁依赖了 monolog/monolog,写成 monologmonolog/monolog.git 都会失败。

实操建议:

  • composer show 列出已安装包,复制完整 vendor/name(注意大小写)
  • 如果目标包是 dev-main1.x-dev 这类开发版本,depends 仍能查,但前提是它已被当前项目解析并写入 composer.lock
  • 全局安装的包(如 phpunit/phpunit 通过 composer global)不会出现在项目依赖树里,depends 对它们无效

prohibits 命令为什么总显示“no matching packages”?

composer prohibits package/name 的作用是反向排查冲突源:找出哪些已装包的版本约束,直接或间接阻止你安装指定包。但它不扫描“未来可能装的包”,只看当前 composer.lockcomposer.json 中已声明的约束。

常见卡点:

  • 目标包本身没在 requirerequire-dev 里声明 → prohibits 找不到上下文,自然无输出
  • 冲突来自嵌套依赖的版本范围(比如 A 要求 symfony/console:^5.4,B 要求 symfony/console:^6.0),但 prohibits 只报最上层直接冲突项,深层传递链需配合 composer why-not
  • PHP 版本或扩展限制(如 ext-gd 缺失)不会被 prohibits 捕获,那是 composer check-platform-reqs 的事

依赖树太深看不清?用 –tree 和 –no-dev 控制输出粒度

composer depends 默认只显示一级直接依赖者,而 --tree 才会展开完整层级。但盲目加 --tree 容易刷屏,尤其当某个基础包(如 psr/log)被几十个包间接引用时。

实用组合:

  • 先跑 composer depends vendor/package --tree 快速定位入口点
  • 加上 --no-dev 排除 require-dev 里的测试工具链(如 phpunitmockery),避免干扰主业务依赖分析
  • 如果输出过长,用 composer depends vendor/package --tree | head -n 50linux/macos)或 composer depends vendor/package --tree | morewindows)分页看
  • --tree 不影响 prohibits,后者无此参数,强行加会报错

为什么本地改了 composer.json 却查不到新依赖关系?

dependsprohibits 全部基于当前 composer.lock 的解析结果,不是实时读取 composer.json。你刚在 require 里加了一行,但没运行 composer updatecomposer install,锁文件没更新,命令就看不到这个新包的存在。

关键动作顺序:

  • 编辑 composer.json → 运行 composer update vendor/new-package(精准更新)或 composer install(按 lock 安装)
  • 再执行 depends/prohibits,否则查的是旧状态
  • 如果只是想预判影响,用 composer why vendor/new-package(等价于 depends)+ --dry-run 不可行——Composer 没这个参数,必须真更新才能验

最常被忽略的一点:CI 环境里 composer install 如果用了 --no-scripts 或跳过 autoload 生成,depends 仍能运行,但结果可能和本地不一致,因为某些插件或自定义 installer 会影响依赖解析逻辑。

text=ZqhQzanResources