不能。composer update 不支持 或 vendor/ 等 shell 通配符,会因包名不存在而报错;需用 composer show --installed | grep + cut + xargs 实现前缀批量更新。

composer update 能不能直接用通配符更新包?
不能。composer update 不支持 * 或 vendor/* 这类 shell 通配符——它会把 foo/* 当成一个具体包名去解析,结果报错:Package foo/* not found。Composer 的包名匹配是精确的,不走 glob 或正则。
用 composer show + grep + xargs 实现前缀批量更新
真实可行的做法是:先列出所有已安装包,筛选出符合前缀的,再逐个传给 composer update。Linux/macOS 下一行就能搞定:
composer show --installed --no-ansi | grep '^your-vendor/' | cut -d' ' -f1 | xargs composer update
说明:
-
composer show --installed输出已安装包列表(格式:vendor/name version description) -
grep '^your-vendor/'精确匹配行首前缀(避免误中other-vendor/your-vendor-tool) -
cut -d' ' -f1取第一列(即完整包名),因空格分隔且版本号前有空格 -
xargs composer update把包名作为参数传入,触发批量更新
Windows PowerShell 用户需改用:composer show --installed --no-ansi | Select-String '^your-vendor/' | ForEach-Object { $_.Line.Split(' ')[0] } | %{composer update $_}
为什么不用 composer outdated --direct?
composer outdated --direct 只显示**直接依赖**中可更新的包,且不支持过滤前缀;它无法覆盖 require-dev 中的包,也不包含被间接依赖但你恰好想一并升级的前缀包。更关键的是:它不输出机器可读格式,默认带颜色和对齐空格,grep 容易误匹配。不如 composer show --installed 稳定可靠。
更新时要注意的三个坑
实际执行时容易翻车的地方:
- 如果某个前缀包在
composer.json里用了固定版本(如"your-vendor/tool": "1.2.0"),composer update不会升级它——必须改成约束符(如^1.2)才生效 -
xargs默认一次传全部包名,可能超出系统参数长度限制;大量包时建议加-n 5分批:xargs -n 5 composer update - 某些包存在冲突约束(比如 A 要求
symfony/console ^5,B 要求^6),批量更新可能失败;此时得单独跑composer update vendor/a vendor/b排查
前缀批量更新本质是“多包单次调用”,不是原子操作——某个包更新失败不影响其余,但 Composer 不会自动回退已更新的部分。动手前最好 git add composer.lock && git commit -m "before prefix update"。










