Composer 的版本约束可以分为 版本号约束 和 稳定性约束,两者结合共同影响着 Composer 的版本约束。
版本号从大到小排列,稳定性从 stable、RC、beta、alpha、dev 排列,先排版本号后稳定性。
排列例如:
v1.3 > v1.2.5 > v1.2.3 > v1.2.3-beta > v1.2.1 > v1.2.0-rc > v1.2.0-beta > v1.2.0-dev > v1.2.0
运算符
Composer 可以通过运算符控制包版本。
1.2.3
匹配具体版本。
>=1.0,<=1.2
范围匹配。有效的运算符有:>
、>=
、<
、<=
、!=。如果有多个范围,“,” 表示 逻辑AND,“|”表示 逻辑OR,AND 优先级高于 OR。
通配符 *
1.2.* 匹配 1.2.0(包含) 到 1.1(不包含)之间版本。
波浪号 ~
匹配 下一个重要版本。~ 1.2 匹配 1.2 到 2.0 之间版本。
幂符号 ^
匹配 最新而不产生兼容性问题的版本。
一横符号 -
匹配区间。5.2 - 5.4 匹配 5.2(包括)到 5.4(包括) 版本。
三段式版本号
大版本.小版本.补丁版本
- 如果你到软件或者库有一些 BUG 被修复了,补丁版本号 +1;
- 如果你增加了新功能,或者代码库增加了一个新方法,用户升级代码库后不会产生兼容问题,小版本号 +1;
- 如果软件完全重构,或者代码库完全重构以至于用户升级之后会产生兼容问题,大版本号 +1。
幂符号 ^ 对比 波浪号 ~
- ~ 只能改变最末尾的版本号,例如: ~1.2.3 匹配 1.2.3(包含) 到 1.3.0 。
- ^ 参考上面 三段式版本号 ,匹配到不产生兼容性问题的版本。也就是说除 大版本号 之外,小版本号 和 补丁版本号 都可以改变。
- 当 版本号 只写到 小版本号 时,~ 和 ^ 匹配相同。例如 ~1.2 和 ^1.2 均匹配 1.2.0(包含) 到 2.0.0。
大版本号以 0 开头
当 大版本号 以 0 开头,^0.3.0 匹配的是 >=0.3.0,<0.4.0。
原因
semantic versioning 规定:以 0 开头的 大版本号 表示一个 非稳定版本(unstable),处于非稳定状态下,小版本号不允许向下兼容。根据 ^ 匹配到不产生兼容性问题的版本的规则,无法改变小版本,因为改变小版本会导入兼容性问题。
⚠️ 所以 ~0.1 匹配 >=0.1,<1.0 比较危险。