我的 composer.json 文件中的波浪号 (~) 是啥意思?

Posted

技术标签:

【中文标题】我的 composer.json 文件中的波浪号 (~) 是啥意思?【英文标题】:What does the tilde (~) mean in my composer.json file?我的 composer.json 文件中的波浪号 (~) 是什么意思? 【发布时间】:2013-09-29 13:23:46 【问题描述】:

我的 composer.json 文件中有这一行:

"require": 
    ...
    "friendsofsymfony/user-bundle": "~2.0@dev",
    ...
,

~2.0@dev 中的波浪号 ~ 究竟是什么意思?那是一个占位符并且应该总是获取像1.2.02.2.03.2.0 等的颠覆吗?没有意义(将由* 通配符完成)。

composer.json documentation 没有告诉任何关于波浪号的信息。

我之所以问,是因为我刚刚读到了 security issue in the Symfony blog,他们建议升级到 1.3.3 版。但是弄清楚 FOSUserBundle 的版本并不容易(我找不到包含该版本的文件)。

【问题讨论】:

【参考方案1】:

波浪号表示下一个重要版本。在你的情况下,它相当于>= 2.0, < 3.0

完整解释在Tilde Version Range docs page:

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

另一种看待它的方式是使用~ 指定最小值 版本,但允许指定的最后一位数字上升。

Seldeak 的以下评论是对 Composer 文档的简单总结说明。

【讨论】:

我喜欢的一个简单的经验法则是 ~ 允许最后一个数字上升。例如~2.2 表示 2.2 和任何 2.x,其中 x 为 2 或更高。 ~2.1.3 也是任何 2.1.x,其中 x 为 3 或更高。 ~2.02.* 有何不同?是不是只有最后一位不是0才有用? ~2.0 和 2.* 相同,但 ~2.3 和 2.* 不同,因为 ~2.3 不允许低于 2.3 的版本,而 2.* 允许 2.0、2.1、2.2 等【参考方案2】:

Tilde 运算符对于使用semantic versioning 方案对其库进行版本控制的项目很有用。

Semantic versioning 更像是一个评估为next significant release 的指南。

对于 Composer,此运算符表示在安装更新时允许次要版本(可能包括补丁)而不允许主要版本(可能不向后兼容) .

例如:~4.1 将允许项目版本 >=4.1<5.0

致谢:http://dwellupper.io/post/37/using-tilde-range-operator-to-resolve-dependency-version-in-composer-php

【讨论】:

【参考方案3】:

~2.0@dev 中的波浪号 ~ 完全意味着升级为即时版本:

例如:

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

【讨论】:

【参考方案4】:

标题~ 是many constraints that can be used to handle versions 之一。

Next Significant Release Operators (~, ^):

~ 运算符最好通过示例来解释:~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

Hyphenated Version Range (-)

包含的版本集。右侧的部分版本包括 用通配符完成。例如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

Wildcard Version Range (.*)

您可以使用 * 通配符指定模式。 1.0.* 是等价的 的>=1.0 <1.1

Simple Version Range (>, >=, <, <=, !=)

通过使用比较运算符,您可以指定有效范围 版本。有效的运算符是 >、>=、

您可以定义多个范围。用空格分隔的范围 ( ) 或 逗号 (,) 将被视为逻辑与。双管 (||) 将是 视为逻辑或。 AND 的优先级高于 OR。

最后是Exact Version Constraint

您可以指定包的确切版本 示例:1.0.2

【讨论】:

以上是关于我的 composer.json 文件中的波浪号 (~) 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 选择器中的波浪号

bash 中的不等波浪号

Vue CLI 3 使用波浪号“~”构建输出文件

CSS `url()` 中的 `~` 波浪号有啥作用?

重命名为带波浪号的文件夹

使用〜(波浪号)导入的 SCSS 文件在 Angular 6 中不起作用