composer install 不支持 --dry-run 参数,该选项仅适用于 composer update 和 composer require(composer 2.2+ 稳定支持),直接使用会报错“unrecognized option”。

composer install --dry-run 为什么没效果
因为 composer install 默认不支持 --dry-run 参数,直接加会报错:Unrecognized option: --dry-run。这个参数只在 composer update 和 composer require 中有效,且从 Composer 2.2+ 才正式稳定支持。
- 旧版本(
-
install不支持是因为它依赖composer.lock,行为确定性高,官方认为没必要加预演 - 想预览 install 效果?得先用
composer update --dry-run看锁文件会怎么变,再推断 install 行为
composer update --dry-run 看到的到底是什么
它模拟更新全过程,但不写入任何文件:不改 composer.lock、不下载包、不执行脚本。输出里关键信息是「Resolving dependencies」和「Writing lock file」这两段——前者告诉你哪些包会被升级/降级,后者显示新锁文件内容差异(如果启用 --verbose)。
- 加
-v或--verbose才能看到具体包版本变化,否则只提示「Would update x packages」 - 如果项目有
platform配置(如"php": "8.1"),--dry-run会严格按此解析兼容性,避免误判 - 注意:它不会跳过
post-update-cmd脚本的检查逻辑,但真执行时才调用;预演中脚本本身不运行
require 命令加 --dry-run 的真实用途
这是最常被低估的用法:composer require vendor/package --dry-run 能提前暴露冲突,比如 PHP 版本不匹配、依赖环、或某个包要求的扩展未启用。
- 常见错误现象:
Your requirements could not be resolved to an installable set of packages—— 预演时就抛出,省得删 vendor 重试 - 不加
--dry-run时,Composer 可能先下载部分包再失败,浪费时间和磁盘空间 - 参数顺序敏感:必须写成
composer require foo/bar --dry-run,不能写成composer require --dry-run foo/bar(旧版会忽略) - 搭配
--no-update也没意义,因为--dry-run本身就跳过更新
别把 --dry-run 当成安全网
它只校验依赖图和锁文件变更,不验证运行时行为。比如某包在预演时能装上,但实际加载时因 autoloader 错误或扩展缺失而崩溃,--dry-run 完全发现不了。
- CI 流程里用它防大范围依赖污染很有效,但不能替代本地
composer install && php -m | grep needed_ext - 私有仓库认证失败、网络超时等外部问题,预演阶段通常不触发(除非启用了
--with-dependencies并涉及远程解析) - 最易忽略的一点:它不检查
autoload-dev下的类是否仍可解析,dev 依赖变更可能悄无声息地破坏测试环境










