不能直接查。composer depends 仅识别 vendor/ 下已安装的真实包,虚拟包(如 php、ext-zip)不落地为目录,也不在 installed.json 中,执行会报“Package not found”错误;需通过 composer show --tree 搜索或 grep -r 扫描 installed.json 间接定位约束来源。

composer depends 命令能查出虚拟包的依赖关系吗
不能直接查。composer depends 本身只识别已安装的真实包(即 vendor/ 下实际存在的包),而虚拟包(如 php、ext-zip、lib-curl)不落地为目录,也不出现在 installed.json 中,因此默认执行 composer depends virtual-package-name 会报错:[InvalidArgumentException] Package "xxx" not found。
如何间接定位哪些包在约束虚拟包
虚拟包虽不可被 depends 追溯,但它的约束来源非常明确:只来自 composer.json 中的 require 或 require-dev 字段里的 php、ext-*、lib-* 等键,或其依赖链中其他包的 composer.json 的对应字段。
实操建议如下:
- 运行
composer show --tree,然后人工搜索输出里是否含php:、ext-json:等行——这些就是当前解析出的平台约束来源 - 用
grep -r '"php":\|'"ext-"' vendor/composer/installed.json(需先composer install)可快速扫描所有已安装包声明了哪些虚拟依赖 - 对根项目,直接看
composer.json的require和require-dev;对第三方包,去 Packagist 页面点开其composer.json查看require段
PHP 8.0 升级时最常踩的坑:虚拟包版本写死
大量老包在 composer.json 里写 "php": "^7.4" 或 "php": ",哪怕代码完全兼容 PHP 8.0,Composer 也会因虚拟包约束冲突拒绝安装。这不是 bug,是设计行为。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
解决思路不是绕过 depends,而是放宽约束本身:
- 加
--ignore-platform-req=php临时跳过检查(仅调试用,勿提交) - 用
composer require --update-with-dependencies vendor/package:version强制升级到已适配 PHP 8.0 的新版 - 若维护自己的包,把
"php": "^7.4 || ^8.0"显式写进composer.json,避免用这类排他性写法
真正要盯住的不是 depends,而是 platform 配置
很多人花时间折腾 depends 想理清谁拖了后腿,结果发现根源在 composer.json 顶层的 config.platform.php。比如设了 "platform": {"php": "7.4.33"},就会让 Composer 认为“当前环境只有 PHP 7.4”,从而拒绝所有声明支持 ^8.0 但没同时申明 ^7.4 的包——哪怕你本地跑的是 PHP 8.2。
检查方式很简单:composer config --list | grep platform。删掉或修正它,往往比分析依赖树更有效。

















