^允许向后兼容的版本更新,遵循SemVer,如^1.2.3等价于≥1.2.3且<2.0.0;~更严格,仅允许修复或有限次要更新,如~1.2.3等价于≥1.2.3且<1.3.0。

在 composer 中,^ 和 ~ 都是用来定义依赖包版本约束的操作符,但它们允许更新的范围不同。
^ 版本约束(兼容性约束)
^ 表示允许向后兼容的版本更新,遵循语义化版本规范(SemVer)。
- 对于主版本号为 0 的包(如 ^0.9.5),只允许修复和次要版本更新,不允许主版本更新。即允许 0.9.5 到 0.9.x 或 0.10.x,但不能到 1.0.0。
- 对于主版本号 ≥1 的包(如 ^1.2.3),允许次要版本和修复版本更新,但不允许主版本更新。即允许 1.2.3 到 1.x.x,但不能升级到 2.0.0。
举例:
- ^1.2.3 等价于允许版本 ≥1.2.3 且 <2.0.0
- ^0.9.5 等价于允许版本 ≥0.9.5 且 <0.10.0
~ 版本约束(波浪线约束)
~ 更加严格,通常只允许修复版本(patch)的更新,有时也包括次要版本,具体取决于你指定的精度。
- ~1.2.3 表示允许 ≥1.2.3 且 <1.3.0,即允许 1.2.x 的更新,但不进入 1.3.0。
- ~1.2 相当于 ~1.2.0,表示允许 ≥1.2.0 且 <1.3.0。
也就是说,~ 锁定了最小的“向上边界”,一般用于希望更稳定、避免意外引入新功能的场景。
关键区别总结
- ^1.2.3:允许更新到 1.x.x 中任意低于 2.0.0 的版本(包括 1.3.0、1.4.0 等)
- ~1.2.3:只允许更新到 1.2.x 的版本,最高到 1.2.9,不会进入 1.3.0
如果你希望项目能安全地获取新功能和修复,用 ^;如果只想接受 bug 修复类更新,用 ~ 更稳妥。
基本上就这些,理解清楚对控制依赖稳定性很有帮助。