composer show 是查看已安装包的最轻量可靠方式,支持 -s、--format=json、包名过滤、--tree 查依赖树及 --locked 基于 lock 解析;真正权威依赖快照是 composer.lock 文件本身。

composer show 列出所有已安装包
直接运行 composer show 就能看到当前项目里所有已安装的包及其版本,这是最轻量、最可靠的实时查看方式。它不依赖 lock 文件是否完整,也不要求 vendor 目录存在(只要 composer.json 在就行)。
常见错误是误用 composer list —— 那只是列出可用命令,不是包列表。
- 加
-s参数可显示包的简短描述(composer show -s) - 加
--format=json可输出结构化数据,适合脚本解析(composer show --format=json) - 想查某个具体包?直接跟上名字:
composer show monolog/monolog
composer show --tree 查看依赖树结构
单纯列表看不出谁依赖谁,composer show --tree 会按嵌套层级展开,一眼看出 laravel/framework 为什么拉进了 symfony/http-foundation。
注意:这个命令只展示当前已安装的依赖关系。如果 vendor 被删了但 lock 还在,它会报错说“package not installed”,此时得先 composer install 或改用 composer show --tree --locked(见下一条)。
-
--locked强制基于composer.lock解析,即使 vendor 为空也能跑 - 输出过长时建议加
| less或重定向到文件:composer show --tree --locked > deps-tree.txt - 某些深度嵌套的 dev-only 包可能被隐藏,加
--dev才显示
composer export 导出可安装的依赖列表(非标准命令)
Composer 没有原生的 composer export 命令。所谓“导出所有包”,实际只有两种靠谱路径:
- 导出 lock 文件里记录的精确版本:
composer show --locked --format=plain(每行一个vendor/name version) - 生成可用于新环境安装的最小依赖清单:
composer show --direct --format=plain(只列require和require-dev中声明的顶层包) - 若真需要类似 npm 的 flat 列表(含所有 transitive 依赖),得靠外部工具,比如
jq解析composer.lock:jq -r '.packages[] | "\(.name) \(.version)"' composer.lock
别信网上搜到的 composer dump-autoload --optimize 或 composer update --dry-run —— 它们跟导出列表完全无关。
composer.lock 是唯一权威依赖快照
真正能保证环境一致的,只有 composer.lock 文件本身。它包含每个包的 exact version、source type(git/dist)、shasum、require 映射等全部信息。
很多人试图用 composer show 结果去重建环境,结果发现版本对不上——因为没考虑 lock 里的 constraints、platform config、甚至 private repo 的 alias 设置。
- 部署时应始终提交
composer.lock,并用composer install(而非update)还原 -
composer show --locked输出的是 lock 里的数据,但格式不如直接读 lock 文件稳定 - CI/CD 流程中,校验
composer.lock是否过期,应该用composer update --dry-run,而不是比对show输出
lock 文件一旦被手动编辑或 git 冲突后修复不当,整个依赖一致性就崩了——这点比命令怎么写重要得多。










