composer如何导出依赖列表_composer show命令教程【分析】

composer show 默认不支持直接导出,需用 –format=json 重定向保存为结构化数据,或用 grep 过滤后保存为文本;–tree 输出含 ansi 码需加 –no-ansi 才可重定向;-d 仅列直接依赖且按包名排序,无法体现完整依赖链;查 root 包需指定完整 name;show 输出的是安装版本而非 composer.json 中的约束版本,复现依赖应以 composer.lock 为准。

composer如何导出依赖列表_composer show命令教程【分析】

composer show 列出所有已安装包但太杂乱,怎么快速导出为文本

默认 composer show 只在终端滚动输出,没法直接保存或筛选。它本质是调试用命令,不是导出工具。

真正能导出的其实是加 --format=json 或重定向到文件:

  • composer show --format=json > deps.json —— 得到结构化数据,适合后续解析
  • composer show | grep "/" > deps.txt —— 简单过滤出包名行(因包名含 /,如 monolog/monolog
  • 别用 composer show --tree 导出:树形输出含 ANSI 颜色码,重定向后变成乱码,需加 --no-ansi

composer show -D 显示依赖关系但层级错乱,怎么看清谁依赖谁

composer show -D 会列出每个包的直接依赖,但顺序按包名排,不是按依赖链组织。想理清 A → B → C 这种链路,得手动追踪。

更实用的做法是分两步:

  • 先用 composer show --tree 查某个具体包的依赖树:composer show --tree monolog/monolog
  • 若要全局分析,composer show --format=json 输出后,用脚本提取 require 字段(注意:JSON 中字段名是 require,不是 requires
  • 警惕 require-dev:它不会出现在 show -D 结果里,但会出现在完整 JSON 中,容易漏掉测试依赖

composer show 报错 “Package not found”,但包明明装好了

常见原因是拼写错误或作用域混淆。Composer 区分 root package 和 vendor packages,composer show 默认只查 vendor 下的包。

  • 查自己项目(root):用 composer show myvendor/myproject —— 必须和 composer.json 里的 name 完全一致,包括 vendor 名
  • 查未启用 autoloading 的本地路径包:composer show 不识别,它只认已解析进 vendor/ 的包
  • 查被替换(replace)或禁止安装(”provide”)的包:它们不会出现在 show 列表中,即使功能由其他包提供

导出结果里没有版本约束(如 ^2.0),只有安装版本(如 2.12.3),怎么还原 require 行

composer show 只反映当前 lock 文件状态,不回溯 composer.json 里的原始约束。这是设计使然,不是 bug。

要拿到原始 require 版本号,必须看源配置:

  • 直接读 composer.jsonrequirerequire-dev 字段
  • composer show --format=json 得到的是 lock 后的实际版本,和 composer.lockpackages 数组一致
  • 如果项目没提交 composer.lockshow 输出的版本可能和别人环境不一致 —— 这就是为什么导出列表不能代替 lock 文件做部署校验

真正需要可复现的依赖快照,别依赖 show,老实用 composer.lockcomposer install --dry-run 验证。