composer depends vendor/package-name 是唯一能本地精准查出“谁用了这个包”的原生命令,2.2+ 版本稳定可用;它反向列出所有显式或隐式 require 目标包的已安装包(含 root 项目),而 composer show --tree 是正向依赖、composer why 仅返回单条路径,均无法全面覆盖反向依赖关系。

直接用 composer depends vendor/package-name,这是唯一能本地精准查出“谁用了这个包”的原生命令,2.2+ 版本稳定可用,不需要插件、不依赖 Packagist 页面数据。
为什么 composer depends 是首选,而不是 composer show --tree 或 composer why
composer show --tree 查的是“这个包依赖谁”(正向),composer why(等价于 composer show --why)查的是“为什么装了这个包”,但只返回一条路径;而 composer depends 才是真正反向的——它列出所有已安装包中,显式或隐式 require 了目标包 的节点,包括 root 项目本身。
- 如果
composer why monolog/monolog只显示laravel/framework,但实际symfony/console也间接拉了它,composer depends会把两者都列出来 -
composer depends默认只输出包名,不带版本约束;加--tree才展开完整路径(注意:不是--tree参数本身有缩进树形,而是命令整体输出结构化层级) - 别信网上说的
composer depends --recursive—— 官方不支持该参数,加了会报错
composer depends 返回空?先确认这三件事
常见现象是执行后没输出,或只显示 root,但你知道肯定还有别的包在用它。这时候大概率不是命令失效,而是环境没对齐:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确保当前目录是项目根目录(有
composer.json和composer.lock),且已运行过composer install或composer update - 检查包名是否拼错,尤其是大小写和斜杠方向:
monolog/monolog对,Monolog/Monolog或monolog-monolog错 - 目标包可能被
replace或provide声明覆盖了(比如你装了psr/log的替代实现),此时composer depends查不到原始包名,得改查提供者:composer depends psr/log
怎么看出是 require 还是 require-dev 引入的?
composer depends 默认不区分依赖类型,但你可以用 --link-type=require 或 --link-type=require-dev 精准筛选:
-
composer depends monolog/monolog --link-type=require-dev—— 只看开发依赖链,适合清理测试工具链 -
--format=json输出结构化数据,字段linkType明确标出是require还是require-dev,方便脚本解析 - 如果某个包同时出现在两种类型里(比如
phpunit/phpunit在require-dev,但它又依赖monolog/monolog在require),那它最终属于 runtime 依赖,不能简单按 dev 删掉
想看全网谁用了它?别指望 composer depends
它只扫描当前 vendor/ 和 composer.lock,不会联网查 Packagist。Packagist 官网的 “Used by” 数字只是爬虫抓取公开 composer.json 的粗略统计,点进去常为空或漏掉私有库、未提交的 fork。
- 真要评估升级或废弃影响,必须分两步:先用
composer depends --tree确认本地所有依赖路径,再用 GitHub 搜索filename:composer.json "monolog/monolog"扫描公司内部仓库 - 注意
--tree展开的路径是当前锁文件的快照,如果你刚改了composer.json但还没update,结果就是“过期”的——这点最容易被忽略

















