不支持。composer update 原生命令完全不识别 *、? 等 shell 通配符,会直接报错;批量更新需用 composer show + grep + awk 等 shell 组合实现,且需注意版本兼容性、dev 依赖、lock 文件冲突等问题。

composer update 支持通配符吗?
不支持。原生命令 composer update 完全不识别 *、? 或类似 shell 通配语法。你写 composer update monolog/* 或 composer update "psr-*",Composer 会直接报错:Package "monolog/*" not found 或 Could not find package psr-*。这不是版本约束写错了,是命令根本没这个解析逻辑。
想批量更新某类包,实际能用的方案
靠 Composer 自身做不到,但可以用 shell + composer show 组合实现。核心思路:先列出已安装的包名,用 grep 筛出匹配模式的,再拼成 composer update 参数传进去。
- Linux/macOS 下常用一行搞定(比如更新所有
psr-开头的包):composer update $(composer show --no-ansi | grep '^psr-' | awk '{print $1}' | xargs) - Windows PowerShell 用户得换写法,不能直接用
$(),推荐先导出再执行:composer show --no-ansi | Select-String "^psr-" | ForEach-Object { $_.Line.Split(" ")[0] } | % { composer update $_ } - 注意
composer show输出格式依赖于 Composer 版本(2.x 和 1.x 列对齐不同),awk '{print $1}'在 2.x 下基本可靠;若遇到空格在包名里(极少见),改用cut -d' ' -f1更稳
为什么不用 composer require --update-with-dependencies 替代?
这个选项只影响当前 require 的包及其直系依赖,不是“按名筛选后更新”。它不会帮你捞出所有 symfony/* 包并升级——除非你显式 composer require symfony/framework-bundle 并带上该 flag。而且它可能触发意外的依赖树重装,比单纯 update 更重。
-
composer update vendor/package是精准控制,只动指定包及其满足约束的子依赖 -
composer require vendor/package --update-with-dependencies是“假装新装”,会重新计算整棵子树,容易升过头或降级其他已有包 - 真正要批量更新,还是老实用
show + grep + update那套,可控、可复现、不碰无关包
容易被忽略的兼容性坑
批量更新不是点一下就完事,尤其当多个包共享同一依赖时,顺序和约束冲突会立刻暴露。
- 别在 CI/CD 流水线里无脑跑批量 update —— 某些包(如
phpunit/phpunit)升级可能要求 PHP 版本跳变,而你的环境还没准备好 - 如果包名含斜杠(如
myorg/mylib),grep 时记得转义或用锚定:grep '^myorg/',否则grep 'myorg'可能误中otherorg/myorg-utils -
composer update默认跳过 dev 依赖,如需更新phpunit这类,必须加--with-all-dependencies或明确加--dev
最麻烦的其实是 lock 文件合并:多人同时批量更新不同前缀的包,composer.lock 的哈希块容易冲突,建议这类操作尽量在功能分支里做,更新完立刻提交 lock 文件。










