我们在开发过程中使用到许多第三方库,需要在composer.json中指明依赖库版本规则来安装恰当的包。

Composer 推荐的版本规则是语义化版本,版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改
  • 次版本号:当你做了向下兼容的功能性新增
  • 修订号:当你做了向下兼容的问题修正

基本约束

具体版本

安装指明的具体版本,如果其他依赖包需要不同的版本,安装或更新过程将失败。

  • 1.2.3

范围

使用比较运算符指明有效版本范围。可用操作符如下:>>=<<=!=

可以定义多个范围,使用空格( )或者逗号(,)分隔的范围当做逻辑与操作,使用双管道(||)分隔的范围当做逻辑或操作。

  • >=1.0
  • >=1.0 <2.0
  • >=1.0 <1.1 || >=1.2

带连字符的范围

非完整的版本号会用通配符补全,比如 2.0 补全为 2.0.*

  • 1.0 - 2.0 等价于 >=1.0 <2.1
  • 1.0.0 - 2.1.0 等价于 >=1.0.0 <=2.1.0

通配符

可以在版本号中使用通配符(*)。

  • 1.0.* 等价于 >=1.0 <1.1

下一个重要版本

对于遵循语义化版本的项目,波浪号和脱字符提供更加简介的表达。

波浪号(~)

波浪号常用于标记依赖包的最小版本。可以理解为波浪号标记依赖包的最低版本,并允许版本号最后一位数字增加(不适用于主版本号)。

  • ~1.2 等价于 >=1.2 <2.0.0
  • ~1.2.3 等价于 >=1.2.3 <1.3.0

脱字符(^)

脱字符的行为和波浪号类似,但更强调语义化版本,总是允许向后兼容的更新。

  • ^1.2.3 等价于 >=1.2.3 <2.0.0

不过,对于早于1.0的版本,脱字符处理逻辑如下:

  • ^0.3 等价于 >=0.3 <0.4

注:为了最大化互操作性,对于库类型的项目,推荐使用脱字符声明依赖包的版本。

稳定性

如果版本约束中没有显式定义稳定性,Composer 内部会根据操作符的不同,默认附加 -dev 或者 -stable。如果你希望只安装稳定版本,请在使用 -stable 后缀。

约束 内部
1.2.3 =1.2.3-stable
>1.2 >1.2.0.0-stable
>=1.2 >=1.2.0.0-dev
>=1.2-stable >=1.2.0.0-stable
<1.3 <1.3.0.0-dev
<=1.3 <=1.3.0.0-stable
1 - 2 >=1.0.0.0-dev <3.0.0.0-dev
~1.3 >=1.3.0.0-dev <2.0.0.0-dev
1.4.* >=1.4.0.0-dev <1.5.0.0-dev

参考