composer show 是查看当前项目全部已安装包最轻量可靠的方式,不加参数即显示 require 和 require-dev 下所有包;--tree 会隐藏 dev 包;导出用重定向或 --format=json;composer.lock 才是权威快照来源。

composer show 能直接列出所有已安装包
不需要额外插件或导出命令,composer show 就是查看当前项目依赖树最轻量、最可靠的方式。它默认显示所有已安装的包(包括 require 和 require-dev),按字母序排列,格式清晰。
常见误操作是加 --tree 后只关注顶层依赖,反而漏掉 dev-only 包;其实不带参数就能看到全部:
composer show
如果想导出为文本文件留档,直接重定向即可:
-
composer show > deps.txt—— 纯文本,适合人工查阅 -
composer show --format=json > deps.json—— 结构化数据,方便后续解析
composer show --tree 会隐藏 require-dev 包
这个命令只展示「实际被加载」的依赖路径,默认跳过仅用于开发阶段的包(比如 phpunit/phpunit、friendsofphp/php-cs-fixer)。如果你在 CI 中需要完整清单,或者要审计安全范围,单靠 --tree 是不完整的。
验证方式很简单:
- 运行
composer show | wc -l记下总行数 - 再运行
composer show --tree | wc -l,通常少十几到几十行 - 差异部分基本就是
require-dev下的包
composer.lock 是最权威的依赖快照来源
当项目部署或做合规审计时,composer.lock 比 composer show 更值得信赖:它记录了确切的 commit hash、dist URL、install-path,甚至包含平台配置(PHP 版本、扩展要求)。
提取包名和版本最稳妥的方法是解析 JSON:
jq -r '.packages[] | "\(.name) \(.version)"' composer.lock
注意两点:
- 用
.packages而不是.packagesDev—— 后者只含 dev 包,且新版 Composer 已弃用该字段 - 若需合并 dev 和 prod,得手动拼接:
jq -r '(.packages + .packagesDev)[] | "\(.name) \(.version)"' composer.lock
别用 composer outdated 导出清单
composer outdated 只显示有更新可用的包,而且默认过滤掉 dev 包(除非显式加 --all)。它本质是对比远程仓库的版本,并非真实安装状态快照。
典型陷阱:
- 本地锁文件已锁定旧版,但
outdated显示“无更新”,让人误以为依赖干净 - 某些私有包因源不可达,直接从结果中消失,造成清单缺失
- 输出格式不稳定:带颜色、带箭头符号(→)、带括号说明,不适合管道处理
真正要导出“当前装了什么”,永远优先信 composer show 或 composer.lock,而不是谁“可能该升级了”。
导出这件事本身很简单,难的是搞清你要的是「运行时实际加载的」,还是「声明过的全部依赖」,或是「锁定文件里精确到 commit 的那一份」——三者不等价,选错来源,后面自动化或审计就容易出偏差。










