composer show 默认只显示直接依赖,加 -t 参数可查看完整树状结构;--format=json 输出结构化数据,--locked 读取 composer.lock 快照,--no-dev 可排除开发依赖。

composer show 能否导出完整依赖树
composer show 默认只显示直接依赖(即 composer.json 里写的包),不包含递归依赖。想看完整树状结构,得加 -t 参数:composer show -t。但注意:这个输出是纯文本、不可直接用于自动化处理,也不含版本约束(比如 ^2.0)或来源类型(dist vs source)。
用 composer show --format=json 导出结构化数据
真正适合后续解析或存档的是 JSON 格式:composer show --format=json。它返回所有已安装包(含间接依赖)的名称、版本、描述、源地址等字段。如果只想导出扁平列表(不含嵌套关系),可配合 jq 提取关键信息:
composer show --format=json | jq -r '.[] | "\(.name) \(.version) \(.source.type // "dist")"'
这会输出类似 monolog/monolog 2.9.3 dist 的每行一条记录,方便比对或审计。
生成 lock 文件对应的精确依赖快照
最权威、可复现的依赖清单其实已经存在——就是 composer.lock。它记录了每个包的确切版本、校验和、安装源及依赖关系。不需要额外“导出”,直接提交该文件即可。若需人工阅读,可用:composer show --locked(只读 composer.lock,不检查 composer.json 变更)。常见误区是运行 composer install 前没确认 composer.lock 是否更新,导致本地依赖与 CI 环境不一致。
导出时忽略 dev 依赖的正确写法
生产环境部署通常要排除 require-dev 中的包。composer show --no-dev 仅影响命令本身是否显示 dev 包,但 --format=json 和 --locked 默认都包含全部。真正生效的是加 --no-dev 到整个命令链中:
composer show --no-dev --format=jsoncomposer show --no-dev --locked
注意:composer install --no-dev 才会影响实际安装行为;单纯导出命令加 --no-dev 只控制输出范围。
导出依赖看似简单,但混淆 composer.json、composer.lock 和实际安装状态,是线上环境依赖漂移最常见的源头。别依赖临时命令生成清单,优先维护好 composer.lock 并在 CI 中严格校验它的完整性。










