查“谁引入了某个包”唯一可靠方式是composer why --tree,前提是包已安装;composer depends不查vendor内实际依赖,仅扫描composer.json显式声明。

镜像本身不提供依赖追踪能力,它只加速下载;查“谁引入了某个包”,必须用 composer show --who 或 composer why --tree,且前提是包已安装。
为什么 composer depends 不能用来查反向依赖
这个命令不是为“谁用了我”设计的:composer depends 只扫描你项目 composer.json 中显式写的 require 和 require-dev,完全不读 vendor/ 里任何包的 composer.json。常见失败场景包括:
-
Could not find package:90% 是包名输错,monolog/monolog≠Monolog/monolog,大小写和斜杠都敏感 - 命令不存在:Composer 版本低于 2.5,运行
composer --version确认 - 结果为空但
ls vendor/foo/bar存在:说明它是被某个已安装包(比如guzzlehttp/guzzle)作为子依赖带进来的,而那个父包没出现在你的composer.json中 - 加了
--dev却没效果:因为--no-dev优先级更高,两者混用时后者会覆盖前者
查“谁把我拉进来的”唯一可靠方式是 composer why --tree
这个命令能真实还原依赖链路,但它有硬性前提:目标包必须已安装到 vendor/ 下,否则静默失败(不是报错,是没输出)。使用要点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 默认不查
require-dev链路;如果包只被phpunit/phpunit引用,得加--dev - 遇到
provide声明的虚拟包(如psr/log),why --tree可能不显示任何内容——此时要退回到composer show --tree | grep -B2 -A2 "psr/log"手动翻 - 输出末尾出现
your-project-name dev-main,才确认是你自己composer.json里写的require - 依赖树里同一包反复出现,只说明被多个上游包分别引入,不等于装了多份;要看真实版本是否一致,运行
composer show symfony/polyfill-php80查
查已安装依赖树必须用 composer show --tree,不是 composer tree
composer tree 根本不是 Composer 内置命令,是早年插件遗留的混淆概念。真正能用、稳定、无需额外安装的只有 composer show --tree。它读的是当前 vendor/ 目录下已实际安装的包结构,反映的是 composer.lock 解析后的真实快照,不是 composer.json 里写的“理想状态”。注意:
- 必须在项目根目录运行,且目标包得已安装;否则报错:
Package not found - 想查未安装包的依赖?加
--remote:例如composer show --remote --tree monolog/monolog - 不支持
--depth参数限制层级,真要截断只能靠head -n 50或重定向到文件后人工看 - 终端宽度太窄会导致缩进换行错位,建议用
composer show --tree --no-dev | less -S横向滚动看
镜像配置错误会导致依赖分析失效,但不会报错
镜像只影响下载速度,不影响依赖解析逻辑——但配置写错会让 composer show、why 等命令卡住或返回空结果,因为元数据拉不下来。最容易被忽略的一点:vendor/composer/installed.json 是快照,不是权威源——它只反映上一次 composer install 或 update 的结果。改了 composer.json 后没重装,所有 show 类命令看到的仍是旧状态。验证镜像是否生效,别只信 composer config repo.packagist.org 的输出,要跑一次 composer clear-cache && composer install -vvv 2>&1 | grep "GET",确认日志里出现镜像域名而非 packagist.org。










