不能,Composer原生不支持通配符批量更新;只能指定多个具体包名(如composer update monolog/monolog symfony/console)或借助插件(如bamarni/composer-bin-plugin)配合shell脚本过滤更新。

composer update 能不能用通配符批量更新?
不能直接用 * 或 vendor/* 这类通配符触发 composer update —— Composer 原生不支持 glob 模式匹配包名。你敲 composer update vendor/*,它会报错:Could not find package vendor/*,不是找不到包,是压根不解析通配符。
真正能批量更新的,只有两种方式:指定多个具体包名,或用插件补足能力。
手动列包名是最稳的批量更新法
如果你知道要更新哪些包(比如所有 monolog/ 开头的、或几个核心 dev 依赖),直接把它们列在命令里就行:
composer update monolog/monolog symfony/console symfony/filesystem
这种写法明确、可复现、CI 友好。注意几点:
-
composer update默认只更新composer.lock中已有的包,不会装新包;加--with-all-dependencies才会连带升级子依赖(慎用,容易破) - 如果某个包在
composer.json里没声明,只是间接依赖,composer update xxx不会理它——得先把它显式加进require或require-dev - 版本约束写死了(如
"^1.2")时,update不会跨主版本,哪怕有2.0也不动;想升大版本得先改composer.json
想按前缀批量更新?用 composer-require-checker 或插件
官方不支持 monolog/*,但社区有轻量方案。最常用的是 hirak/prestissimo 已停更,现在推荐:
- 装
composer-unused(查未用包)+composer normalize(格式化)组合,虽不直接批量更新,但能帮你快速识别可清理/可升级的包范围 - 真要按命名空间批量操作,用
composer global require bamarni/composer-bin-plugin,再配合自定义脚本遍历composer show --name-only输出,过滤出monolog/开头的,拼成命令执行——别手写循环,用 shell 就够了:
composer show --name-only | grep '^monolog/' | xargs -r composer update
⚠️ 注意:xargs 在 Windows(Git Bash 除外)上行为不一致;Mac 上默认 xargs 不支持 -r,得用 gxargs(brew install findutils)。
为什么不用 composer update --dry-run 先看影响?
--dry-run 不是“预览”,它只模拟安装流程,不实际下载,但依然会解析依赖图、计算版本、甚至触发插件钩子。问题在于:
- 它不会告诉你「这个包会从 3.2 升到 4.0」,只说「Updating xxx (3.2.0 => 4.0.0)」——但你看不到 break change 是否涉及你代码
- 如果某包的
post-update-cmd有副作用(比如清缓存、生成配置),--dry-run仍可能执行它(取决于插件实现) - 真正安全的做法是:开个新分支 →
composer update xxx→git diff composer.lock看锁文件变化 → 跑测试 → 再决定合入
锁文件才是真相,别信控制台那几行绿色输出。










