composer install 不支持 --dry-run,会报错“Unrecognized option”;真正支持该参数的是 update、require 和 remove 命令,其中 update --dry-run -v 可预览锁文件变更及包升降级详情。

composer install 不支持 --dry-run,直接加会报错“Unrecognized option: --dry-run”——这是最常踩的坑。 真正能用 --dry-run 预览变更的,是 composer update、composer require 和 composer remove 这三个命令;而 composer install 的行为由 composer.lock 严格决定,预演它的效果,得靠 composer update --dry-run 先看锁文件会怎么变。
哪些命令真正支持 --dry-run
不是所有命令都行,支持的只有:
-
composer update --dry-run:完整重解析依赖图,列出将升级/降级/移除的包,不改 lock、不写 vendor -
composer require vendor/package --dry-run(Composer 2.2+):预判新增依赖是否引发冲突、是否强制更新已有包 -
composer remove vendor/package --dry-run:确认该包是否被其他依赖强引用,删了会不会连带卸载一堆东西
注意:composer install --dry-run 是无效组合,官方从未实现;composer update --dry-run 也 ≠ composer install --dry-run —— 前者是“重新算一遍”,后者根本不存在。
为什么 update --dry-run 要加 -v 才有用
默认输出只显示类似 Updating monolog/monolog (2.9.0 => 3.0.0) 这种简略行,但你看不到它为什么升到 v3,也不知道 symfony/console 被悄悄从 v6 降到了 v5.4。加 -v 后才会暴露关键细节:
- 哪个
conflict规则触发了降级 - 版本约束求解时回退到了哪个候选版本
- 是否因平台配置(如
"php": "8.1")排除了本可选的更高版本
没 -v 的 --dry-run 就像只给你一张机票,却不告诉你航班已取消。
常见误用和对应风险
这些操作看似合理,实则危险或无效:
- 运行
composer update --dry-run --no-interaction却不接判断逻辑:它默认成功退出,即使检测到 PHP 版本不兼容也不会报错,CI 中必须配合|| exit 1或解析输出关键词 - 以为
--dry-run能验证网络可用性:它确实会访问 Packagist,但私有源认证失败、代理拦截、token 过期等,往往在真实 install 阶段才暴露 - 忽略 dev 依赖变更:预演不会提示
phpunit版本升级后导致测试用例里expectException()行为变化,这类问题只能靠本地跑测试发现
最易被跳过的一步是:执行 composer update --dry-run -v 后,不人工扫一眼「Downgrading」和「Installing new package」这两类行——它们背后大概率藏着 BC break 或未授权引入的第三方包。











