--dry-run用于预览composer操作而不实际执行,显示增(+)、更新(~)、删(-)等动作及脚本计划,但不模拟autoload或软链,也无法预知网络、权限、PHP版本等运行时问题。

composer install 和 composer update 加上 --dry-run 参数,不会真正写入文件或修改依赖,只输出将要执行的操作——这是验证变更安全性的最轻量方式。
什么时候必须用 --dry-run
你正在修改 composer.json(比如新增包、调整版本约束、切换仓库源),但不确定它会不会触发意外的降级、冲突或大量重装。又或者你在 CI/CD 流水线里想提前拦截高风险操作。
- 本地开发中改完
composer.json后,先跑composer update --dry-run看是否真会删掉某个关键包 - 团队协作时收到他人提交的
composer.lock变更,用composer install --dry-run确认它不会覆盖你当前已安装的 dev-only 工具 - CI 脚本里加一句
composer update --dry-run --no-interaction,失败即中断,避免误更新线上依赖
--dry-run 能看到哪些关键信息
输出内容不是日志,而是结构化动作列表:哪些包会被安装、更新、回滚、跳过,以及是否涉及 post-install-cmd 类脚本的执行计划。注意它不模拟 autoload 生成或 vendor/bin 软链创建,这些仍需真实运行后验证。
- 行首带
+表示将新增(如+ monolog/monolog: 2.9.0) - 带
~表示将更新(如~ guzzlehttp/guzzle: 7.5.0 → 7.8.1) - 带
-表示将卸载(如- phpunit/phpunit: 9.6.13) - 若出现
Skipped提示,通常是因为该包已满足约束且无新版本可选
常见误判点和限制
--dry-run 不等于“绝对安全”。它基于当前 composer.lock 和本地 composer.json 计算,但无法预知网络故障、私有包权限变更、或平台配置(如 PHP 版本)导致的后期失败。
- 它不会检查
require-dev中包的兼容性,除非你显式加上--with-all-dependencies - 如果用了
platform配置(如强制"php": "8.2"),--dry-run会按此计算,但实际运行时若 PHP 版本不符,仍会报错 -
composer require --dry-run foo/bar会尝试解析最新匹配版本,但不保证该版本在你的目标环境(如 Docker 镜像)中可用 - 它不校验
autoload规则是否冲突,也不运行composer dump-autoload --dry-run(这个命令本身不存在)
composer update laravel/framework --dry-run Loading composer repositories with package information Updating dependencies Package operations: 1 install, 2 updates, 0 removals - Updating symfony/polyfill-php81 (v1.28.0 => v1.29.0) - Updating illuminate/support (v10.35.0 => v10.40.0) + Installing laravel/framework (v10.40.0) Writing lock file
真正影响落地的是 lock 文件变更细节和平台一致性——--dry-run 只帮你挡住明显错误,挡不住隐性不兼容。










