composer depends只查显式声明,不查间接依赖;若返回空,说明monolog/monolog未在composer.json的require或require-dev中直接声明,而是被其他包间接引入,应改用composer why --tree monolog/monolog溯源。

composer depends 不能识别“过时日志组件”的依赖链——它根本不管版本新旧,也不查是否过时,只看谁在 composer.json 里显式写了这个包。
composer depends monolog/monolog 为什么总返回空或报错
它不是“谁用了旧版 monolog”,而是“谁在 composer.json 的 require 或 require-dev 里直接写了 monolog/monolog”。常见情况:
-
Could not find package monolog/monolog:包名大小写或斜杠错误,必须是小写全名,monolog/monolog≠Monolog/Monolog - 返回空:项目 composer.json 里根本没声明它——它大概率是被
laravel/framework或symfony/console这类包间接拉进来的 -
Command "depends" is not defined:Composer 版本低于 2.5;运行composer --version确认,旧版必须升级或改用composer why - 加了
--dev没效果:因为--no-dev优先级更高,两者混用时后者会覆盖前者
真正能定位“谁把旧版 monolog 带进来”的命令是 composer why --tree
composer why --tree monolog/monolog 才是反向追踪源头的可靠方式,但它有硬性前提:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 目标包必须已安装到
vendor/下,否则静默无输出(不是报错) - 默认不查
require-dev链路;如果 monolog 只被phpunit/phpunit引用,得加--dev - 输出末尾出现
your-project-name dev-main,才说明是你自己在 composer.json 里写的require - 遇到
psr/log这类provide虚拟包,why --tree可能不显示任何内容,此时要退回到composer show --tree | grep -B2 -A2 "psr/log"手动翻
判断 monolog 是否“过时”,别靠 depends,用 outdated + show 组合
composer outdated 只比对 composer.lock 中的 installed 版本和当前约束下的 latest 稳定版,它不等于“安全过时”或“PHP 兼容过时”:
-
composer outdated显示monolog/monolog 2.10.0 → 3.5.0,但如果你的 composer.json 写的是"monolog/monolog": "^2.0",那 3.5.0 根本不会被装上 - 想确认实际安装版本,运行
composer show monolog/monolog查versions字段 - 想知道它被哪些上游包以什么版本引入,得结合
composer show --tree | grep -A5 monolog/monolog看缩进层级,再对每个父包单独执行composer show vendor/package查其依赖约束 - 安全漏洞不在此范围:
monolog/monolog v1.27.0可能已是 v1 分支最新稳定版,但若存在 CVE,outdated不会提示——得靠composer audit或第三方数据库
最易被忽略的一点:vendor/composer/installed.json 是快照,不是权威源——它只反映上一次 composer install 或 update 的结果。删了 vendor 重装、或手动改过 composer.json 却没 update,所有依赖分析都会失真。

















