composer show 默认输出表格格式,不输出 JSON;必须显式加 --format=json 参数才能获得结构化数据,该参数不可缩写,否则报错。

composer show 命令默认不输出 JSON,需加 --format=json 参数
直接运行 composer show 只会输出表格格式的依赖列表,无法直接用于自动化解析。要得到 JSON,必须显式指定格式。注意这个参数不能缩写(比如 --format=json 不能写成 -f json),否则会报错 Invalid option '--f'。
常用组合:
-
composer show --format=json:导出当前项目所有已安装包的完整信息(含版本、描述、依赖关系等) -
composer show --format=json --no-dev:排除require-dev中的包,适合生产环境快照 -
composer show --format=json vendor/package-name:只查单个包,返回结构一致的 JSON 对象
composer depends 不支持 --format=json,得用 jq 或 PHP 脚本后处理
想查“哪些包依赖了某一个库”,比如 composer depends monolog/monolog,这个命令本身不接受 --format 参数,输出是纯文本。如果需要 JSON,得靠外部工具转换:
- Linux/macOS 下可用
jq:先用composer depends monolog/monolog --tree输出树形结构,再用jq -R 'split("\n") | map(select(length > 0))'粗筛(但无法还原依赖层级) - 更可靠的做法是调用 Composer 的 PHP API:
Composer\Repository\InstalledRepository+Composer\DependencyResolver\Pool,手动构建依赖图并json_encode() - 简单场景下,直接用
composer show --format=json输出全部,再用 PHP 或 Python 解析,搜索require字段里是否包含目标包名
composer dump-autoload --classmap-authoritative 不影响 JSON 导出,但影响依赖解析结果
JSON 输出内容取决于当前 vendor/ 目录实际安装状态,和 autoloader 配置无关。但如果你刚执行过 composer install --no-dev 或清空过 vendor/,再跑 composer show --format=json 就可能漏掉 dev 包——这不是 bug,是预期行为。
- 确认是否含 dev 包:检查输出 JSON 中是否有
"require-dev"字段,或看composer.json是否启用了"config": {"minimum-stability": "dev"} - 若需锁定版本用于 CI,建议配合
composer.lock使用:composer show --format=json的版本号与 lock 文件一致,但不会体现platform配置(如 PHP 版本)对可选包的影响 - 注意:JSON 中的
version字段可能是dev-main或9999999-dev,这是 Composer 对未打 tag 分支的标记,不是错误
导出 JSON 后常见解析问题:字段嵌套深、null 值、非标准布尔值
Composer 输出的 JSON 结构并不扁平:require 和 require-dev 是对象,键为包名,值为版本约束字符串;autoload 字段下又分 psr-4、classmap 等子对象。直接用 json_decode($output, true) 没问题,但容易忽略:
- 某些包的
description字段为null,PHP 中需判空,不能直接 echo -
type字段值可能是library、project、metapackage,没有文档定义全集,需容错处理 - 版本约束字符串如
^2.0 || ^3.0不能直接当语义化版本比较,要用Composer\Semver\VersionParser解析
真正麻烦的是跨平台一致性:Windows 上 composer show --format=json 可能因换行符或编码(BOM)导致 json_last_error() 返回 JSON_ERROR_UTF8,建议用 mb_convert_encoding($output, 'UTF-8', 'auto') 预处理。


















