--with-dependencies 仅更新目标包及其自身 composer.json 中声明的 require/require-dev 包,不递归处理依赖的依赖;例如 foo/bar 依赖 monolog/monolog,则会按其最新版约束重解析 monolog,但不会动 monolog 所依赖的 psr/log。
composer
update
会更新哪些包
这个参数不是“更新目标包 + 它的直接依赖”,而是“更新目标包 + 所有被该包声明在
或
中的包(无论当前是否已安装)”。换句话说,它把目标包当作一个“依赖锚点”,拉取其
里写的全部依赖项,并按当前
的版本约束重新解析、升级或降级。
常见错误现象:
后,
被升到 v3(你项目没写任何 v3 约束),但你的代码跑崩了——因为
的最新版要求
,而 Composer 尊重了它的声明,没管你原来的
。
只对明确列出的包生效,
(不带包名)会报错
不会递归处理“依赖的依赖的依赖”,只看目标包自己的
如果目标包的依赖和你项目已有约束冲突,Composer 会尝试找交集;找不到就失败,不会跳过
不用
也能更新依赖的替代方案
多数时候你真正想要的是“更新 A 包,并让它用上最新兼容的子依赖”,而不是强制对齐它的最新
。这时更安全的做法是先删掉
和
,再跑
——但代价大、不可控。
更实用的路径是分两步:
先运行
(不加参数):只更新
本身,子依赖保持 lock 文件记录的版本
再运行
(把你知道它依赖的关键包列出来):让 Composer 重新计算这些包之间能共存的最新版本
这样既避免了
的“全盘接管”风险,又比全量 update 快且可预测。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
和
的区别
名字像,行为差很远:
是“更新目标包 + 所有它依赖的包 + 这些包依赖的包……一直到底层”,也就是整个依赖树里所有被牵连的包都会被重新 resolve;而
只看目标包自己声明的
列表。
性能影响明显:
在大型项目中可能卡住几十秒,还容易触发内存溢出(尤其 PHP 内存限制
以下时);
相对快,但依然可能因跨 major 版本升级引发兼容问题。
两者都不修改你项目根目录
的约束,只影响
如果你的
依赖
,而
又依赖
,那么
不会动
,但
会
PHP 8.1+ 下某些包的 autoloading 行为变化,会让
触发意外的 class not found,尤其涉及
映射变更时
更新前必须检查的三个地方
很多人执行完
就直接 commit,结果 CI 失败或线上报错。核心问题是没提前确认依赖链的真实影响范围。
打开目标包的 packagist 页面(比如
https://www.php.cn/link/a2896cb11aed969ffec7bb02a7c772a8
),点开最新版的
,手动看它的
字段写了什么,特别是有没有
版本限制、
扩展要求
运行
查当前安装版本,再运行
看谁依赖它——避免你更新它导致上游调用方出问题
本地改完后,别只跑 PHPUnit:用
(如果定义了)或手动执行
扫描所有改动文件,防止语法错误漏过
最常被忽略的是:目标包的某个新依赖可能引入了和你现有包冲突的 PSR 类型(比如两个包都提供
但实现不兼容),这种问题不会在 update 阶段报错,只会在第一次调用时 fatal error。
--with-dependenciesrequirerequire-devcomposer.jsoncomposer.jsoncomposer update foo/bar --with-dependenciesmonolog/monologfoo/barmonolog:^3.0monolog:^2.0composer update --with-dependenciescomposer.json--with-dependenciescomposer.jsonvendorcomposer.lockcomposer installcomposer update foo/barfoo/barcomposer update foo/bar monolog/monolog symfony/event-dispatcher--with-dependencies--with-all-dependencies--with-dependencies--with-all-dependencies--with-dependenciesrequire--with-all-dependencies1.5G--with-dependenciescomposer.jsoncomposer.lockfoo/barguzzlehttp/guzzleguzzlehttp/guzzlepsr/http-client--with-dependenciespsr/http-client--with-all-dependencies--with-all-dependenciespsr-4composer update foo/bar --with-dependenciescomposer.jsonrequirephpext-*composer show foo/barcomposer depends foo/barcomposer run-script post-update-cmdphp -lPsr\Log\LoggerInterface