必须用 composer show --locked 导出精确依赖清单,它直接读取 composer.lock,输出实际安装的包名、精确版本、dist url、shasum 和来源类型,不依赖 vendor/ 目录完整性,加 --no-dev 可排除开发依赖,--format=json 适合脚本解析。

导出 Composer 依赖清单,**不能只看 composer.json,也不能只信 composer show 默认输出——真正可复现、可审计的清单,必须来自 composer.lock,且需明确区分“已安装”“已声明”“已锁定”三层状态。**
用 composer show --locked 导出精确版本快照
这是唯一不依赖 vendor/ 目录完整性、直接读取 composer.lock 的可靠方式。它输出的是实际安装时解析并锁定的每个包的 exact version、dist URL、shasum 和来源类型。
-
composer show --locked默认包含require-dev包;加--no-dev可排除,适合生产环境归档 -
--format=json输出字段稳定(.name、.version、.dist.shasum),适合 CI 解析或 SBOM 生成 - 不加
--locked时,composer show读的是vendor/composer/installed.json,若有人手动删过子目录,结果就失效 - 旧版 Composer 可能不支持
--locked,请先运行composer self-update
导出纯文本包名+版本(人工审计/文档记录)
别用 grep 或 cut 硬切 composer show 输出——包名含空格、描述换行、ANSI 颜色都会导致截断错误。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最稳妥:用
jq解析 JSON:composer show --locked --format=json | jq -r '.packages[] | "\(.name) \(.version)"' - 要含开发依赖:
composer show --locked --dev --format=json | jq -r '(.packages + .packagesDev)[] | "\(.name) \(.version)"' - 没装
jq?用 PHP 原生命令:php -r '$l=json_decode(file_get_contents("composer.lock")); foreach($l->packages as $p) echo "$p->name $p->version\n";' - 注意:
composer.lock中某些包的version是dev-main或带+no-version-set后缀,说明来自 path repo 或未打 tag 的本地仓库,需人工确认
为什么 composer show --tree 不适合存档或交接
它输出的是实时依赖树结构,但有三个硬伤:不带锁定版本、默认隐藏 require-dev 包、重复显示多路径引入的包(比如 A→C 和 B→C 都会列出 C)。
-
composer show --tree读的是vendor/当前文件结构,不是composer.lock,无法保证可复现 - 它不会显示仅用于开发、但未被任何运行时代码加载的包(如
phpunit/phpunit在非测试环境下可能不出现) - 输出中无哈希、无 dist URL、无平台约束(PHP 版本、扩展要求),这些恰恰是跨环境部署的关键信息
- 想临时排查依赖冲突?可以;想生成交付物?请换
--locked
别混淆 composer show 和 composer list
composer list 只列出 Composer 自带命令,和项目依赖完全无关——这是新手最常踩的坑。
-
composer show(无参数)默认只显示直接依赖,不是全部已安装包;加--all或--tree才包含间接依赖 -
composer show --name-only只从composer.json提取包名,不查vendor/,也不读composer.lock,结果只是“声明”,不是“事实” -
composer outdated是版本对比工具,不是清单命令;它可能因私有源不可达而漏包,输出还带颜色和箭头符号,无法管道处理 - 真正可还原依赖的,只有
composer.lock文件本身;所有文本导出(.txt/.json)都只是它的只读副产品
最容易被忽略的一点:即使 composer.lock 存在,如果没执行过 composer install 或 composer update,vendor/ 就是空的,此时 composer show --locked 虽然能跑,但 composer show(无参数)会报错 “Could not find package information”。导出动作本身不触发安装,它只是读取——你得先确保锁文件和 vendor 状态对得上。










