不能。它只展示composer.lock中已解析的依赖树,不标冲突,但能暴露多路径引入同名包(如symfony/console在phpunit和laravel下分别引入^6.0与^5.4),配合grep和(locked to X.Y.Z)可识别隐式冲突风险。

composer show --tree 能不能直接看出冲突?
不能。它只展示当前 composer.lock 里已成功解析的依赖树,不是“理想状态”,而是“真实现场”——哪怕有隐藏冲突前兆(比如同名包被不同路径引入多个版本),它也不会标红或报错,只会安静地列出两行看似无关的路径。
但它能帮你发现那些你根本没写、却被 require-dev 包悄悄拖进来的冲突源。例如:phpunit/phpunit 拉了 symfony/console ^6.0,而你主应用用的 laravel/framework ^10.0 又依赖 symfony/console ^5.4,show --tree 会同时显示这两条链,让你一眼意识到枢纽包正在被撕扯。
- 执行
composer show --tree | grep "symfony/console"快速定位同一包是否出现在多条路径下 - 注意每行末尾的
(locked to X.Y.Z),那是已被锁定的版本,删composer.lock才可能松动它 - 如果某包在树中出现多次且版本不同(如
^5.4和^6.0),说明已存在隐式冲突风险,哪怕还没报错
怎么用 composer show 预防互斥组件引入?
关键不是等报错,而是装之前先查“它带谁来”。比如你想加 spatie/laravel-backup,别急着 require,先看它实际会拉什么:
composer show spatie/laravel-backup 输出里重点关注 requires 和 requires (dev) 字段,尤其是那些你项目里已有或计划用的枢纽包,比如 illuminate/support、guzzlehttp/guzzle、monolog/monolog。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 对比你当前
composer.json中对这些包的约束,比如你写了"monolog/monolog": "^2.0",但新包 require"monolog/monolog": "^1.25",那就大概率冲突 - 用
composer show vendor/package查目标包所有可用稳定版本,确认是否存在交集版本(如双方都支持^2.4) - 特别留意
conflict字段——有些包会明写"conflict": {"laravel/framework": ">=11.0"},这种是硬性拦路虎
为什么 composer show --platform 是预防步骤里的必做项?
很多“冲突”根本不是包之间的事,而是你的环境不达标。比如你想装 symfony/console ^6.0,但它要求 php ^8.0,而你本地是 PHP 7.4,composer update 就会卡在“无法满足平台要求”,报错里却可能混在一堆依赖链中,不易识别。
composer show --platform 会干净列出你当前 PHP 版本、已启用扩展(如 ext-json、ext-intl)、以及 Composer 自己的运行环境。对照你要引入的包文档里的 require 字段,提前核对。
- 常见陷阱:本地开发开全扩展,但生产服务器缺
ext-intl或ext-ctype,导致部署时才暴露冲突 - 看到
php行提示版本不符,别硬调包,先升级 PHP 或换低版本包 - 扩展名(如
ext-mbstring)在composer.json的conflict或require里出现时,必须确保php -m能列出它
composer show 为什么不能替代 composer why-not?
composer show 告诉你“现在有什么”和“它声明要什么”,但不回答“为什么我指定的版本装不上”。真正卡住你的,往往是某条你没注意的间接依赖链。
比如你执行 composer require monolog/monolog:^2.10 失败,composer show monolog/monolog 只会告诉你这个包本身支持哪些版本;而 composer why-not monolog/monolog:^2.10 会倒着查出:“因为 your-project-name require laravel/framework ^9.0,而 laravel/framework ^9.0 requires monolog/monolog ^1.25”——这才是真实阻断点。
-
why-not输出必须从最后一行倒着读,最后一行是你自己的根约束,往上才是层层拦截者 - 如果输出中出现
your-project-name,说明是你自己composer.json里写的约束太窄或互斥,不是第三方问题 -
show是静态快照,why-not是动态推理,两者配合才能看清全貌
composer show 默认只显示一级依赖。你得主动加 --tree 或配合 grep 深挖,否则所谓“预防”,只是在表面扫了一眼。

















