composer audit查不出版本冲突,因为它只比对composer.lock中已安装包版本与PHP-SECADV数据库的CVE条目,不读composer.json、不参与依赖解析、不检查约束自洽性,也无法检测未进入lock文件的潜在冲突。

composer audit 为什么查不出版本冲突
composer audit 只比对 composer.lock 中已安装包的版本与 PHP-SECADV 数据库里的 CVE 条目,它不读 composer.json,不参与依赖解析,也不检查约束是否自洽。所以哪怕你写了 "monolog/monolog": "^2.0" 和 "laravel/framework": "^10.0"(后者实际要求 monolog ≥3.0),audit 也完全无感。它跳过所有未进入 lock 的包——而真正的冲突,往往就卡在“该装哪个版本却卡住”的求解阶段。
怎么快速定位谁在封杀目标版本
别猜报错里那句 Conclusion: don't install symfony/console 6.4.0 是谁干的,直接运行:
composer why-not symfony/console:6.4.0
它会输出真实阻断链,比如:
-
myapp/myproject dev-mainrequiresguzzlehttp/guzzle(^6.5) -
laravel/sanctum ^3.0requiresguzzlehttp/guzzle(^7.2)
这就锁定了冲突源头是 guzzlehttp/guzzle 的版本范围无交集。注意:why-not 查的是“你想装但装不了”的包;如果还没执行过 require 或 update,why 命令反而可能查不到有效路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
如何发现 lock 文件里“看似正常实则危险”的多版本共存
有些包在 composer.lock 中存在多个版本(如 psr/log 同时出现 1.2.0 和 3.0.0),audit 不会警告,但它可能引发运行时 Class not found 或行为不一致。
- 用
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/containerv1 和 v2 并存)
为什么 --dry-run 比直接 update 更值得优先执行
composer update vendor/package --dry-run 不改任何文件,但完整跑一遍依赖解析,输出拟变更清单。它能暴露三类关键问题:
- 哪些包会被升级/降级(尤其注意主版本号变化,比如
v2 → v3) - 是否触发意外的传递依赖更新(比如升
guzzlehttp/guzzle连带把symfony/http-foundation从v5推到v6) - 有没有报新的
conflict提示(说明你刚解了一个,又撞上另一个)
全量 update 容易让 SAT 求解器卡住几分钟,还可能引入新问题;--dry-run 是可控性的第一道防线。加 -v 参数还能看到它反复尝试又回退的路径,比盲等更有效。

















