Composer 2.5+ 支持 composer install --dry-run 或 update --dry-run,完整解析依赖、检测冲突但不写入 vendor;老版本可用 prohibits 定位冲突或 validate 校验 JSON 合法性。

Composer 本身没有 --dry-run 参数来“模拟安装并检查兼容性”,但有几种等效且更精准的方式,能在不写入 vendor/ 或修改 composer.lock 的前提下,验证依赖是否可解析、是否冲突。
用 composer validate 检查基础合法性
这是最轻量的第一步,它只校验 composer.json 格式是否正确、字段是否合法(比如 name、version、require 格式),不涉及远程包或版本解析。适合排查手误(如逗号漏写、引号不闭合)。
- 运行:
composer validate - 加
--strict可额外检查推荐字段(如 description、license)是否缺失 - 注意:它 不会 告诉你 laravel/framework ^10.0 和 guzzlehttp/guzzle ^8.0 是否能共存
用 composer install --dry-run(Composer 2.5+ 支持)
从 Composer v2.5.0 开始,install 和 update 命令原生支持 --dry-run。它会完整执行依赖解析、版本约束求解、平台配置检查(PHP 版本、扩展)、冲突检测,并打印将要安装的包列表——但跳过下载、解压和写入 vendor。
- 运行:
composer install --dry-run(需已有composer.lock) - 或:
composer update --dry-run(重新解析全部依赖,无视 lock 文件) - 成功时输出类似:
Nothing to install, update or remove或列出待安装包 - 失败时明确提示冲突,例如:
Conclusion: don't install symfony/console v6.4.0
用 composer prohibits 定位具体冲突
当 --dry-run 报错但信息不够直观时,可用 prohibits 快速定位哪个包在阻止某个版本安装。它不安装任何东西,纯逻辑推理。
- 例如报错说无法安装
monolog/monolog 3.0.0,就运行:composer prohibits monolog/monolog:3.0.0 - 输出会列出所有已声明的依赖中,哪些版本范围与
3.0.0冲突(比如your/project requires monolog/monolog ^2.0) - 也支持检查 PHP 版本:
composer prohibits php:8.3
用 composer show --outdated --direct 辅助评估升级风险
虽然不是严格意义上的“兼容性检查”,但它能快速列出当前 composer.lock 中直接依赖(非传递依赖)的可升级版本,并标出是否含重大变更(BC break)。配合 --dry-run 使用,可预判 update 后可能出问题的包。
- 运行:
composer show --outdated --direct - 关注标记为 ! 的包(表示有 major 版本更新)
- 再对单个包试运行:
composer update vendor/package --dry-run
基本上就这些。核心是:Composer 2.5+ 的 --dry-run 是最贴近“不安装只检查”的方案;老版本可用 update --dry-run(需先删 lock 文件)或组合 prohibits + 手动推理。不复杂但容易忽略版本门槛。










