composer audit只检测已锁定包的安全漏洞,不参与依赖解析,故无法发现版本冲突;它不读composer.json约束、不检查版本兼容性,仅比对composer.lock中包版本与PHP-SECADV数据库。

composer audit 不能发现版本冲突,它只查已知漏洞,不解决依赖解析问题。 想排查潜在版本冲突,得用 composer update --dry-run、composer depends --tree 和 composer show 这套组合,而不是指望 audit 报出“symfony/console 版本不一致”这种错误。
为什么 composer audit 查不到版本冲突
audit 的工作原理是比对 composer.lock 中每个已安装包的 name + version 是否命中 PHP-SECADV 数据库里的 CVE 条目。它完全不参与依赖求解过程,也不检查约束是否自洽。
- 它不会读
composer.json里的require字段,所以哪怕你写了"monolog/monolog": "^2.0"和"laravel/framework": "^10.0"(后者要求 monolog ≥3.0),audit 也毫无反应 - 它跳过所有未进入
lock文件的包——而冲突往往就发生在“该装哪个版本却卡住了”的阶段 - 报错信息如
Conclusion: don't install symfony/event-dispatcher 6.4.0是 Composer 解析器输出的,audit 根本不生成这类提示
真正能定位冲突源的三个命令
遇到 composer install 或 composer update 失败时,按顺序执行以下命令,能快速锁定矛盾点:
-
composer update --dry-run:不改任何文件,但完整跑一遍依赖解析,输出最清晰的冲突链,例如package-a v2.1 requires symfony/console ^5.4 → package-b v3.0 requires symfony/console ^6.0 -
composer depends --tree vendor/package:查某个包被谁拉入、在哪个层级、带什么版本约束,比如monolog/monolog是被laravel/framework拉进来的,还是你直接require的 -
composer show vendor/package x.y.z | grep require:确认特定版本实际依赖哪些其他包及其约束,避免被宽泛的^符号误导
如何识别“看似没冲突,实则危险”的间接依赖
有些包在 composer.lock 里存在多个版本(比如 psr/log 同时出现 1.2.0 和 3.0.0),audit 不会警告,但它可能引发运行时行为不一致或 class not found 错误。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 用
git diff composer.lock | grep -A2 '"psr/log"'快速筛出版本变动,重点看version和dist.shasum是否变化 - 若发现同一包名对应不同
source.type(如一个来自git,一个来自package),说明 Composer 已做降级或替换处理,需回溯composer.json中哪些require引入了冲突约束 -
composer show --locked | grep "psr/"能列出所有已锁定的 PSR 包,人工核对 major 版本是否混用(如psr/container1.x 和 2.x 共存)
CI 环境中避免漏掉隐性冲突
本地 composer install 成功,CI 却失败,常见原因是平台约束(PHP 版本、扩展)未在 composer.lock 中显式固化,导致依赖解析结果不同。
- 检查
composer.lock中的platform字段是否与 CI 环境一致;若缺失,应在composer.json中补上"platform": {"php": "8.2.0", "ext-redis": "5.3.7"} - CI 流水线里加一步:
composer show --platform,对比输出和composer.lock的platform区域,不一致就立即 fail - 不要在 CI 中用
composer update替代composer install——前者会重新解析,后者才强制还原 lock 快照
真正麻烦的不是报错的冲突,而是那些没报错却悄悄混入不兼容版本的间接依赖。它们不会触发 composer update 失败,也不会被 audit 扫到,只能靠定期检查 composer.lock 结构和人工验证关键包的版本收敛性。










