composer show --locked 是查看项目真实安装依赖(含间接依赖)的准确方式,它读取 composer.lock 文件,输出精确版本、源类型和 dist hash;不加 --locked 仅显示声明依赖,忽略传递依赖。

composer show 是查看已安装库详情的直接方式,但它的输出默认只展示顶层依赖;要查清间接依赖、版本来源、安全状态,必须配合 --locked 和结构化过滤。
用 composer show --locked 看真实安装的包全貌
它读取 composer.lock 而非 composer.json,能准确列出所有已安装包(含间接依赖)、精确版本、源类型和 dist hash。这是审计依赖真实状态的起点。
- 不加
--locked时,composer show只显示require和require-dev中声明的包,忽略传递依赖 - 执行
composer show --locked | grep "guzzlehttp/psr7"可快速确认该间接包是否真被拉入项目 - 若输出为空,说明该包未出现在
composer.lock中——可能是被conflict排除、被replace替换,或根本没被任何依赖链触发
用 composer show --locked --format=json 提取关键元数据
JSON 格式便于程序解析,尤其适合 CI 或脚本中验证包是否满足审计前提。重点看三个字段:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"source": {"type": "git"}→ 表示来自 Git 仓库,audit 默认跳过,除非该包在 FriendsOfPHP/security-advisories 中有条目 -
"dist": {"shasum": "a1b2c3..."}→ 若为null或空字符串,说明该包未通过 dist 安装,可能影响可重现性 -
"version": "dev-main"或含-dev后缀 →composer audit会静默跳过,因 advisories 不收录不稳定版本
为什么 composer show 查不到某个“应该存在”的间接包
常见原因不是命令失效,而是该包根本没进入 vendor/ 目录或 composer.lock:
-
composer.lock过期:运行composer install或composer update后再试 - 包被
conflict规则排除,比如"conflict": {"guzzlehttp/psr7": " 导致低版本无法安装 - 使用了
path类型仓库或私有 fork,且未在extra.security-advisories中手动注册 - 该包被另一个包通过
replace声明替代,例如symfony/polyfill-mbstring替代原生ext-mbstring
composer audit 和 composer show 的关系不能倒置
很多人先跑 composer audit 再回头查包,结果发现漏报却不知原因。正确顺序是:
- 先用
composer show --locked确认目标包是否真实存在、版本是否稳定、来源是否受支持 - 再运行
composer audit --with-dependencies(等价于--dev)确保 require-dev 树也被覆盖 - 若仍无结果,检查
composer config --global experimental.audit是否为true,并确认网络能访问https://packagist.org/advisories
最易被忽略的是:audit 不分析代码调用路径,也不校验 platform 兼容性——它只比对 lock 文件里的 name+version 是否在 advisory 数据库中登记。这意味着即使 show 显示了包,audit 也可能因数据源缺失而沉默。










