composer show 默认只显示顶层依赖,因其仅读取 composer.lock 中的 packages 字段,忽略间接依赖;完整依赖树需用 --tree,审计推荐导出 --format=short 或直接解析 composer.lock。

直接用 composer show 就能拿到已安装包列表,但默认只显示你手动 require 的顶层包——想看全量、导出、审计,必须加参数或换数据源。
为什么 composer show 默认输出那么少?
它只读 composer.lock 里的 packages 字段(即顶层依赖),跳过所有间接依赖。比如你没直接 require monolog/monolog,而是通过 symfony/console 拉进来的,composer show 就不显示它。
- 执行前确认已在项目根目录,且
vendor/或composer.lock存在;否则报错Could not find package information for -
composer install --no-dev后,require-dev包不会出现在任何show输出里,哪怕它们还在composer.json中 - 包名严格大小写敏感:
symfony/console和Symfony/Console是两个不同包
composer show --tree 查完整依赖树(含嵌套)
这是唯一能还原真实安装结构的命令,输出带缩进和箭头,层级清晰,适合排查冲突或理解依赖来源。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 输出实时反映
vendor/状态,不是仅读composer.json推理 - 终端宽度不够时长包名会被截断,建议加
| less -S或重定向:composer show --tree > deps.tree - 某包被多个路径引入(如 A→B→C 和 D→C),会重复出现,这是正常行为,说明存在多路径依赖
- 加
--no-dev可排除开发依赖:composer show --tree --no-dev
导出扁平化清单(审计/CI/运维常用)
要一行一个 vendor/name version 格式,别手写脚本解析 composer.lock——格式随 Composer 版本变化,composer show 自带输出更稳。
- 最简方式:
composer show --format=short > deps.txt(每行monolog/monolog 2.10.0) - 纯文本无颜色:
composer show --installed --no-ansi > deps.txt(--installed确保只输出真实安装的包) - JSON 结构化(适合程序处理):
composer show --format=json | jq -r'.[] | "\(.name) \(.version) \(.license // "N/A")' - 注意:
--format=json默认不含require-dev,需加--dev才包含phpunit/phpunit等工具
真正要部署或复现?绕过 composer show,直接读 composer.lock
composer.lock 才是生产环境依赖的真实快照。只要它存在且未被修改,composer install 就能 100% 复现相同依赖树——包括嵌套依赖版本、下载源、校验和。
- 提取正式依赖:
jq -r'.packages[] | "\(.name) \(.version)"' composer.lock - 提取开发依赖:
jq -r'.packages-dev[] | "\(.name) \(.version)"' composer.lock - 没装
jq?用 PHP 一行:php -r '$l=json_decode(file_get_contents("composer.lock")); foreach($l->packages as $p) echo "$p->name $p->version\n";' -
version字段末尾带+no-version-set表示该包是 path repo 或未打 tag 的本地仓库,需人工确认
最容易被忽略的是:composer show 显示的是 vendor/ 里真实存在的包,而 composer.lock 记录的是“应该安装什么”。两者不一致时(比如删了 vendor/ 但没重装),show 会失败,lock 却始终可靠。










