composer update --with-dependencies 已被彻底移除,因语义模糊且与默认行为重叠;应改用 --with 或 --with-all-dependencies 精确控制范围,或直接使用 composer update 默认递归更新整棵树。

composer update --with-dependencies 早已被移除
这个命令在 Composer 2.2+ 中已彻底废弃,执行会直接报错:Unrecognized option: --with-dependencies。它不是“暂时不推荐”,而是被明确删除——因为语义模糊、行为不可控,且和 composer update 默认行为重叠严重。
替代方案:用 --with 和 --with-all-dependencies 精确控制范围
Composer 2.2 起引入了更清晰的依赖更新粒度控制:
-
--with vendor/package:只把指定包及其**直接依赖**(即 composer.json 里声明的依赖)纳入更新范围,不递归向下 -
--with-all-dependencies:把指定包 + 它所有层级的依赖(包括子依赖的子依赖)全部加入更新候选集 - 两者可组合使用,例如:
composer update monolog/monolog --with-all-dependencies
注意:--with-all-dependencies 不等于“全量更新”,它仍只作用于你显式列出的包及其依赖树,不会动其他未提及的包。
为什么不能无脑 --with-all-dependencies?
看似方便,实则风险集中:
- 可能意外升级一个底层包(如
symfony/polyfill),导致某个间接依赖的运行时行为变化 - 多个主包共用同一底层依赖时,
--with-all-dependencies可能因版本约束冲突而失败,报错类似:Conclusion: don't install symfony/console v5.4.39 - CI 环境中难以复现,因为 lock 文件变动比预期大,diff 难以审查
真正需要“连带更新依赖的依赖”时,优先考虑:composer update vendor/package --with-all-dependencies --dry-run 先看影响范围。
想安全更新整个依赖树?别绕弯,就用默认行为
如果你本意是“让所有依赖都升到满足约束的最新版”,最简单也最可靠的方式就是:
- 删掉
composer.lock(谨慎!仅限本地验证) - 或直接运行:
composer update—— 它默认已递归解析并更新整棵树,只要版本约束允许 - 若只想更新某类包(如只更新 dev 依赖),用:
composer update --dev
所谓“依赖的依赖”,从来不在 Composer 的更新逻辑之外;它只是你没意识到,默认就已经在做了。










