composer唯一合法的“”是版本号末尾通配符,如"1.0."表示主次版本固定、允许任意修订版本;"1."等价于">=1.0.0 =0.0.0"。

Composer 不支持 shell 风格的通配符(如 * 用于路径匹配、? 或 [a-z]),只接受特定语义的版本通配符,且仅在 require 和 require-dev 的版本字段中生效。
哪些“*”是合法的?只有一种用法
唯一被 Composer 认可的 * 是版本号末尾的通配符,例如 "monolog/monolog": "1.0.*"。它表示:主版本 1、次版本 0 固定,允许任意修订版本(即 1.0.0 到 1.0.999)。
-
1.*合法:等价于>=1.0.0 (注意不是 <code>1.x这种写法) -
1.2.*合法:等价于>=1.2.0 -
1.2.3.*❌ 非法:Composer 解析失败,报错Invalid version string -
monolog/*❌ 非法:包名不支持通配符,会触发Could not find package monolog/* -
"*"单独作为版本值 ❌ 非法:无意义,解析报错
~ 和 ^ 不是通配符,但常被误认
它们是语义化版本(SemVer)约束运算符,行为严格且不可替代:
-
~1.2.3表示>=1.2.3 ,只允许 patch 级更新 -
^1.2.3表示>=1.2.3 ,允许 minor 级兼容更新(前提是遵循 SemVer) -
^0.1.2特殊:因 0.x 属于开发版,等价于>=0.1.2 - 混用风险:
~1.2.*❌ 语法错误;必须写成~1.2.0或1.2.*,二者语义不同
为什么镜像源或仓库配置里不能用通配符?
因为 repositories 字段是 JSON 结构,所有 URL、type、only/exclude 列表都走字面量匹配,不经过版本解析器:
-
"only": ["acme/*"]✅ 合法:这是 Composer 自定义的包名通配语法,仅在only/exclude中有效 -
"url": "https://mirrors.aliyun.com/composer/*"❌ 非法:HTTP URL 不支持通配,会导致Repository type 'composer' has no URL specified -
"packagist.org": false必须显式写出,不能写成"packa*": false
容易忽略的关键点
真正影响依赖行为的不是“写了什么符号”,而是 composer.lock 是否存在以及是否被提交——哪怕你写了 1.2.*,只要 composer.lock 已生成并提交,所有协作者安装的仍是锁定的精确版本(如 1.2.7)。删掉 lock 文件再 install,才会按通配规则重新解析。











