composer show 默认仅显示已安装包名和描述,不显示具体版本号或 lock 信息;要获取可复现快照应依赖 composer.lock,而 composer show --format=json 可输出结构化数据但不含 commit hash 或 source url。

composer show 能导出依赖列表,但默认不带版本锁信息
直接运行 composer show 只列出已安装包名和描述,不显示具体版本号或是否来自 composer.lock。如果要生成可复现的依赖快照,得配合其他命令或参数。
常见错误是误以为 composer show 就等同于“导出清单”,结果在 CI 或协作时发现版本对不上。
- 用
composer show --format=json可获取结构化数据,但不含lock中的精确 commit hash 或 source URL - 真正反映当前项目实际加载版本的,是
composer.lock本身 —— 它不是“导出”,而是“已存在”的权威记录 - 若需人工可读清单(比如发给运维),推荐
composer show -D:它按依赖层级展开,显示包名 + 实际安装版本 + 来源(如dist或source)
用 composer depends 查某个包被谁依赖,避免手动翻 require 字段
当想确认 monolog/monolog 是直接 require 还是被其他包间接拉入时,composer depends 比 grep composer.json 更准——它走的是已解析的依赖图,不是文本匹配。
示例:composer depends monolog/monolog 会列出所有直接或间接依赖它的包,包括它们各自的版本约束(如 ^2.0)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 加
--tree参数能看到完整依赖路径,比如A → B → monolog/monolog - 不加参数时只显示一级依赖者;如果返回空,说明该包当前未被任何已启用依赖引用(可能已被移除但缓存未清)
- 注意:这个命令不检查
require-dev里的包,除非显式加上--dev
导出精简版生产依赖(不含 dev 包)要用 --no-dev + --locked
部署时最常踩的坑:用 composer install --no-dev 却没加 --locked,导致线上装的版本和本地开发不一致 —— 因为没锁文件时,Composer 会按 composer.json 里写的约束重新解析最新兼容版本。
所以“导出可部署的依赖清单”,本质是确保 composer.lock 存在且生效:
-
composer install --no-dev --locked是标准部署命令,它跳过依赖分析,只按 lock 文件安装 - 想生成纯文本清单(如供审计),可用
composer show --no-dev --format=plain | cut -d' ' -f1,2 > deps-prod.txt - 如果项目还没生成过
composer.lock,先跑一次composer update --no-dev(慎用!会改 lock 文件)
vendor/composer/installed.php 不该手动读,它是 Composer 内部运行时缓存
有人试图解析 vendor/composer/installed.php 来提取已装包列表,这不可靠:它结构不稳定(v2 改成 installed.json)、含大量元数据、且不区分 dev 和 prod 环境。
更糟的是,这个文件可能被 opcache 缓存或权限限制,脚本读取时行为不一致。
- 正确做法始终走 Composer 命令行接口,比如
composer show --direct获取直接依赖 - 需要程序化读取时,优先解析
composer.lock(JSON 格式稳定,字段明确) - 如果必须用 PHP 代码获取,建议调用
Composer\InstalledVersions类(Composer 2.2+ 自带),例如InstalledVersions::getInstalledPackages()










