--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 工具
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, 0removals - 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 只帮你挡住明显错误,挡不住隐性不兼容。