composer show --tree 默认只显示一级依赖,非间接依赖未安装,而是输出截断;需加 --all、--no-dev 或指定包名(如 composer show --tree guzzlehttp/guzzle)才能展开完整层级。

composer show --tree 默认只显示一级,不是间接依赖没装,是命令没展开
执行 composer show --tree 后看到的缩进只有一层,不代表没有间接依赖——它只是默认不递归展开下游。这个命令读的是 vendor/composer/installed.json 里的静态记录,结构本身是完整的,但输出做了截断。
真正能看清“谁 → 谁 → 谁”的路径,必须加参数:
-
composer show --tree vendor/package-name:只展开目标包及其所有下游(比如查guzzlehttp/guzzle,会列出它依赖的psr/http-client、ralouphie/getallheaders等) -
composer show --tree --all:从项目根开始,展开全部已安装包的完整树(含require-dev),适合扫全局关系 -
composer show --tree --no-dev:排除开发依赖,聚焦运行时真实链路
想查“谁间接用了我这个包”,用 composer depends --tree
composer depends 是反向查来源的命令,但它默认只列直接依赖者。要看到完整引用链(比如 A → B → C → 你),必须加 --tree:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer depends --tree monolog/monolog:输出类似your-project → laravel/framework → symfony/console → monolog/monolog - 如果某层突然中断(比如停在
laravel/framework就没了),大概率是它用了provide声明虚拟包(如psr/log),Composer 不会继续向下解析 - 结果为空?先确认该包是否已安装:
composer show monolog/monolog能查到,depends才可能查到上游
composer outdated --all 才能看到间接依赖是否过时
composer outdated 默认只检查 composer.json 中显式写的包,monolog/monolog 即使已停更三年也不会出现在默认输出里——因为它不是你 require 的,而是被 laravel/framework 拉进来的。
- 加
--all是唯一办法:composer outdated --all - 但输出太杂,建议过滤:
composer outdated --all --no-dev --minor-only(只看非破坏性更新) - 自动化处理必须用 JSON:
composer outdated --all --format=json | jq -r '.packages[] | select(.latest_status == "semver-major-update") | .name'
注意 lock 文件和 vendor 目录状态决定结果是否可信
所有依赖命令(show、depends、outdated)都基于当前 vendor/ 和 composer.lock 的快照。如果刚删了 vendor 但没重装,或 composer.lock 长期没更新,结果就只是“理论状态”,不是真实环境。
-
composer show --tree报错“No composer.json found”?说明不在项目根目录 -
composer depends提示“Command not defined”?说明 Composer 版本低于 2.2,先跑composer self-update - 查不到私有包?它必须已成功安装(即出现在
vendor/里),且包名要跟installed.json中记录的一致(别用别名)










