composer show -l 是唯一能直接查看 composer.json 中版本约束(如 ^7.4)的命令,它原样输出包名、约束规则和实际安装版本三列信息,不联网、不解析兼容性,仅反映项目声明状态。

composer show -l 是唯一能直接看到每个包在 composer.json 中声明的版本约束(如 ^7.4、~2.8.0、"dev-main")的命令,它不联网、不解析兼容性,只原样输出你写的规则和当前安装版本。
为什么 composer show 不显示版本约束?
composer show 默认读的是 vendor/composer/installed.json,反映的是「实际装了什么」,不是「你想装什么」。它只显示已安装包的名称、当前版本号、描述等运行时快照信息,完全不涉及 composer.json 里的 require 字段内容。
- 想看约束?必须加
-l(--list)参数,这是专门为此设计的开关 - 不加
-l却去grep或head输出,只会看到版本号,看不到^、~、!=这些关键符号 -
composer show monolog/monolog只查这个包自身的元数据(比如它依赖谁),和你的项目约束无关
composer show -l 的真实输出含义
执行后每行类似:monolog/monolog ^3.5.0 3.5.0,三列分别表示:包名、你在 composer.json 中写的约束、当前实际安装的版本。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 第一列是包名,严格区分大小写和斜杠,
psr/log≠PSR/Log - 第二列是约束,
^3.5.0表示允许升到3.x任意版本但不跨大版本;"*"表示无限制;"dev-main"表示强制从分支拉 - 第三列是实际安装版本,如果和第二列明显不匹配(比如约束是
^2.8但装了3.0.0),说明有冲突或minimum-stability被覆盖 - 输出不含颜色,适合管道处理,例如:
composer show -l | grep "laravel/framework"
常见误判场景和排查点
当 composer show -l 显示某包约束宽松(如 ^8.0),但 composer outdated 却没提示可更新,问题往往不在约束本身。
- 本地 PHP 版本低于新版本要求:比如包 v9.0 要求 PHP 8.2,而你本地是 8.1 → Composer 会跳过该版本,即使约束允许
-
composer.lock没提交或被手动修改过:show -l读的是composer.json,但真实安装受lock文件锁定,两者不一致会导致行为偏差 - 私有包未配置正确
repositories:约束写了"my/private-package": "^1.2",但源没声明 →show -l仍会显示该行,但实际无法解析或安装 - 使用了
platform配置(如"platform": {"php": "8.0"}):Composer 会按此模拟环境判断兼容性,导致某些新版本被过滤,show -l看不到这个影响,得配合composer show --platform对照
别用错命令:composer show -a 和 composer outdated 不解决这个问题
composer show -a vendor/package 查的是 Packagist 上该包所有远程版本(含 dev-main、2.10.0-RC1),和你的约束无关;composer outdated 是对比已安装版本与远程最新版是否符合约束,属于结果验证层。
- 它们都不能告诉你「你当初到底写了什么约束」——只有
show -l能 - 如果
show -l输出为空,先确认是否在项目根目录、composer.json是否存在、是否执行过composer install或update - CI 流程中需固化约束快照时,
composer show -l --format=json是唯一可脚本化提取的稳定接口
真正容易被忽略的是:约束只是声明,最终装什么由 composer.lock、PHP 环境、平台配置、仓库可用性四者共同决定。show -l 只管第一环,后面三环得靠 diagnose、show --platform 和 outdated --dry-run 交叉验证。

















