关于这个问题之前是没有注意到的,在阅文面试的时候问到了,回来之后看了一下
可能有很多人和我一样,不是那么清楚各种写法到底是啥意思,比如波浪号 ~,折音号 ^
在了解约束表达式之前,先要了解一下语义化版本
版本格式:主版本号。次版本号。修订号,版本号递增规则如下:主版本号:当你做了不兼容的 API 修改,次版本号:当你做了向下兼容的功能性新增,修订号:当你做了向下兼容的问题修正。先行版本号及版本编译信息可以加到 “主版本号。次版本号。修订号” 的后面,作为延伸
版本约束
例如我们想要下载 5.1 版本的 ThinkPHP 包,我们可以通过 composer.json 文件:
然后运行 install 命令,或者通过 require 命令来加载扩展包
除过像上面这样指定具体的版本,我们还可以通过不同的约束方式去指定版本
使用波浪号 ~ 约束符锁定小版本
这种版本约束方式很实用,也是比较安全的,比如我们希望安装 >= 1.2 并且 < 2.0 的版本时,根据语义化版本的定义,次版本号的变化是新增功能,所以包是稳定的,也就是可以安全更新的
你可以写成:~1.2
如果你希望次版本都不要更新,只允许修订版本(补丁版本)的变化,>= 1.1.15 并且 < 1.2.0
则写成:~1.1.15
所以,~ 的作用是允许表达式中最后一位变到最大值,~1.1 表示可以为 大于等于 1.1 的任何版本,比如 1.1.0、1.2.0、1.3.5 、1.99.9999、 1.9999.999999 都可以安装,但是不能安装 2.0.0, 同理,~1.1.2 表示 大于等于 1.1.2 的任何版本,比如 1.1.2、1.1.3、1.1.99、 1.1.9999 都可以安装
使用折音号 ^ 约束符锁定大版本
上面 ~ 表示最后一位可变,前面几位都不可变,那 ^ 的作用不一样的是:^ 锁定不允许变的第一位,其实用过正则的都知道 ^ 表示起始,^a 表示以 a 开头的全部
它允许升级版本到安全的版本。例如,^1.2.3 相当于 >=1.2.3 <2.0.0,因为在 2.0 版本前的版本应该都没有兼容性的问题
而对于 1.0 之前的版本,这种约束方式也考虑到了安全问题,例如 ^0.3 会被当作 >=0.3.0 <0.4.0 对待
所以,^1.2 表示任意大于等于 1.2 的 1.x.x 版本,比如 1.2.0、1.2.1、1.3.0、1.9.99999 等。只要前面的 1 并且大于 ^ 后面指定的 1.2 都满足条件
锁定版本范围
使用比较操作符你可以指定包的范围。这些操作符包括:>,>=,<,<=,!=
你可以定义多个范围,使用空格 或者逗号 , 表示逻辑上的与,使用双竖线 || 表示逻辑上的或。其中与的优先级会大于或
这样的使用场景并不多,根据你的情况来调整就好
精确版本
可以指定具体的版本,告诉 Composer 只能安装这个版本。但是如果其他的依赖需要用到其他的版本,则包的安装或者更新最后会失败并终止
比如使用 =1.2.34 或者 1.2.34 都是指定了具体的版本号
以上是版本约束的介绍
小林博客






