^ 锁定主版本号,允许次版本和修订号升级;~ 锁定主次版本号,仅允许修订号升级。例如 ^1.2.3 等价于 >=1.2.3 =1.2.3
Composer 中的 ~ 和 ^ 都是版本约束操作符,但它们允许升级的范围不同,核心区别在于“**向后兼容性假设**”的粒度不一样。
^ 会锁定主版本号(MAJOR),允许升级次版本号(MINOR)和修订号(PATCH),前提是项目遵守 SemVer 2.0 规范。
^1.2.3 等价于 >=1.2.3 (可升到 1.x 最新版,但不能到 2.0.0)
^0.5.2 等价于 >=0.5.2 (0.x 被视为不稳定版,只允许 PATCH 升级)
^0.0.3 等价于 >=0.0.3 (仅允许同 patch 升级)
这是 Composer 默认推荐的操作符(比如 composer require monolog/monolog 默认加 ^),适合大多数依赖场景。
~ 表示“至少达到指定版本,并允许在最后一个非零段内自由升级”,相当于“向上取整到该段的下一个整数”作为上限。
~1.2.3 等价于 >=1.2.3 (允许升级到 1.2.x,但不跨 1.3)
~1.2 等价于 >=1.2.0 (省略 patch 号时,按 .0 补全)
~1 等价于 >=1.0.0 (等同于 ^1.0.0)
它比 ^ 更严格(尤其在 MINOR 版本明确时)
,适合你只想接受小范围修复、不想冒任何行为变化风险的情况。
1.2.3:精确版本,不升级>=1.2.0:最低要求,无上限(慎用)1.2.*:等价于 ~1.2.0,即 >=1.2.0
dev-main 或 dev-develop:指向分支,不建议用于生产环境1.2.3),再配合 composer.lock 固化本质上,^ 假设作者守 SemVer,~ 假设作者只在最后一段做安全更新。实际中,多数主流包都尽量守 SemVer,所以 ^ 更常用也更实用。
基本上就这些。