在我的composer.json文件中,波浪号(~)代表什么意思?

133

我在我的composer.json文件中有这行代码:

"require": {
    ...
    "friendsofsymfony/user-bundle": "~2.0@dev",
    ...
},
~2.0@dev中,波浪符号~究竟是什么意思?它是占位符,并且总是获取次要版本,例如1.2.02.2.03.2.0等吗?这没有意义(并且可以使用通配符*来完成)。 composer.json文档对波浪符号没有任何说明。
我之所以问这个问题,是因为我刚刚在Symfony博客中读到了一个安全问题,他们建议升级到1.3.3版本。但是找出FOSUserBundle的版本并不容易(我找不到包含版本的文件)。
4个回答

159
波浪号表示“下一个重要版本”。在您的情况下,它相当于>= 2.0, < 3.0
完整的解释在Tilde Version Range文档页中:
引用:

最好通过示例来解释 ~ 运算符: ~1.2 等同于>=1.2 <2.0.0 ,而 ~1.2.3 等同于>=1.2.3 <1.3.0

另一种看待它的方法是,使用波浪号指定了一个最小版本,但允许指定的最后一位数上升。

Seldeak的下面的评论是Composer文档的简单总结解释。

79
我喜欢用一种简单的规则来解释这个符号,就是它可以让最后一位数字向上取整。例如, 2.2 表示 2.2 和任何 2.x 的数,其中 x 大于等于2。2.1.3 也是类似,表示任何 2.1.x 的数,其中 x 大于等于3。 - Seldaek
4
~2.02.*有什么不同?只有当最后一位数字不是0时才有用吗? - Jesse
31
2.0еТМ2.*жШѓзЫЄеРМзЪДпЉМдљЖ2.3еТМ2.*жШѓдЄНеРМзЪДпЉМеЫ†дЄЇ~2.3дЄНеЕБиЃЄзЙИжЬђдљОдЇО2.3пЉМиАМ2.*еЕБиЃЄ2.0гАБ2.1гАБ2.2з≠ЙзЙИжЬђгАВ - AlterPHP

4
波浪线操作符对于使用语义化版本控制方案的项目非常有用。 语义化版本控制更多的是一个指导方针,它评估到下一个重要版本发布
对于Composer来说,这个操作符意味着在安装更新时允许小版本(可能包括补丁),而不允许主版本(可能不向后兼容)。
例如: ~4.1将允许项目版本>=4.1但是<5.0
来源:http://dwellupper.io/post/37/using-tilde-range-operator-to-resolve-dependency-version-in-composer-php

2

波浪线~是可以用来处理版本的众多约束条件之一

下一个重要版本操作符(~,^)

~操作符最好通过示例来解释:~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,因为直到2.0之前的所有发布都不应该破坏向后兼容性。对于1.0之前的版本,它还考虑了安全性,并将^0.3视为>=0.3.0 <0.4.0连字符版本范围(-) 版本的包含集合。右侧的部分版本是用通配符完成的。例如,1.0 - 2.0 相当于 >=1.0.0 <2.1,因为 2.0 变成了 2.0.*。另一方面,1.0.0 - 2.1.0 相当于 >=1.0.0 <=2.1.0通配符版本范围(.*) 您可以使用 * 通配符指定一个模式。 1.0.* 等同于 >=1.0 <1.1简单版本范围(>、>=、<、<=、!=) 通过使用比较运算符,您可以指定有效版本的范围。有效的运算符包括 >、>=、<、<=、!= 。您可以定义多个范围。以空格( )或逗号(,)分隔的范围将被视为逻辑 AND。双竖线(||)将被视为逻辑 OR。AND 的优先级高于 OR。

最后是精确版本约束

您可以指定包的精确版本。例如:1.0.2


0

在编程中,~~2.0@dev 中的意思是立即升级到下一个版本:

例如:

如果我们有 ~2.0@dev,它会立即升级到下一个版本 => ~2.x@dev


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接