composer show 是最直接的依赖清单命令,读取 composer.lock 输出所有已安装包的名称、版本及描述,支持 --format=json 结构化导出,不依赖网络、不触发安全审计,适用于归档与人工复核。

composer audit 不是生成依赖清单的命令,它只做安全比对;真要快速列出所有已安装包及其版本,得用 composer show 或 composer list 的变体。
怎么快速导出当前项目所有依赖(含版本、来源)
依赖清单 ≠ 安全报告。你真正需要的可能是可读、可存档、可用于人工复核或交接的包列表。composer show 是最直接的选择,它读取 composer.lock 并输出结构化信息,不依赖网络、不触发审计逻辑、不校验漏洞。
-
composer show:默认列出所有 require + require-dev 包,格式为vendor/name version description -
composer show --installed-only:只显示实际存在于vendor/中的包(排除因--no-dev被跳过的 dev 包) -
composer show -N:仅输出包名(适合管道处理,如composer show -N | sort > deps.txt) -
composer show --tree:展示依赖树,能看清谁依赖了谁,但输出较冗长,不适合归档 - 想导出 JSON 便于脚本解析?用
composer show --format=json,字段包含name、version、source、dist等,但不含安全状态
为什么不用 composer audit 来“生成清单”
很多人误以为 composer audit 会先列一遍包再标红漏洞——其实它根本不输出完整包列表。它的输出只有两部分:advisories(有漏洞的条目)或空结果。即使项目有 200 个包,只要没匹配到 advisories,就只打印 No security vulnerabilities found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它不显示未被收录的包(比如私有包、fork 包、本地 path repo)
- 它跳过所有带
-dev、dev-、dev-main的版本(因 advisories 数据库不收录不稳定分支) - 它不告诉你某个包“安全”,只告诉你“当前版本没被标记为已知漏洞”——这不等于“无风险”
- 执行失败时(如网络不通),可能直接报错退出,连空提示都不给
composer show 和 composer.lock 的关系
composer show 的数据源就是 composer.lock,不是 composer.json。这意味着:
- 它反映的是**此刻 vendor/ 中真实安装的状态**,包括子依赖的实际版本(比如
monolog/monolog被symfony/console带进来 3.5.0,它就会显示 3.5.0,而不是composer.json里写的^3.0) - 如果
composer.lock缺失或损坏,composer show会报错或返回不完整结果(此时应先composer install) - 它不校验哈希,也不检查平台约束(
"platform": {"php": "8.1"}不影响输出) - 想确认某包是否真的被装进来了?
ls vendor/vendor/name+composer show vendor/name两步验证最可靠
CI/CD 里怎么稳定产出依赖快照
在自动化流程中,不能依赖交互式命令或本地缓存。以下写法经实测在 GitHub Actions / GitLab CI 中稳定运行:
-
composer show --format=json --no-ansi > deps.json:禁用 ANSI 颜色避免解析失败 -
composer show --direct --no-dev --format=plain | sort > deps-prod.txt:只列顶层生产依赖,按字母排序,方便 diff - 别用
composer list—— 它只列命令,不是包 - 不要在没
composer install的环境下跑composer show,否则会 fallback 到composer.json的约束,漏掉实际安装的子依赖 - 若需带 Git 提交信息(如 lock 文件最后更新时间),可加一行:
git log -1 --format="%h %ad" --date=short composer.lock 2>/dev/null || echo "no lock file"
composer show 输出的版本号,和 composer.lock 中记录的 version 字段完全一致,但和 dist.reference(即 Git commit hash)无关**。如果你靠这个清单做合规审计,得清楚它代表的是语义化版本,不是代码快照。










