版本要求中tilde-greater-than(〜>)的含义?

时间:2010-08-05 11:47:30

标签: ruby rubygems

gem规范中~>版本要求的含义是什么?

hanna-0.1.12 depends on [haml (~> 2.2.8)]

4 个答案:

答案 0 :(得分:86)

RubyGems手册称之为 pessimistic version constraint

假设您已指定n部分版本号,例如1.3(2部分)或 3.5.6.2(4部分)作为约束。然后,为了实现约束, 版本号必须满足以下两个条件

  1. 版本号的前n-1个部分必须与第一个n-1相同 部分约束 (例如1.x3.5.6.x匹配,但0.x3.5.7.x不匹配)

  2. 版本号的最后一部分必须大于或等于最后一部分 约束的一部分 (例如1.99993.5.6.2匹配,但1.23.5.6.1不匹配。

  3. 换句话说

    ~> x1.x2.x3. … .xn-2.xn-1.xn
    

    匹配

    x1.x2.x3. … .xn-2.xn-1.y, y >= xn
    

    这被称为“悲观”约束的原因,也是用例 是的,当你刚才说> x.y.z时,你是乐观的:你假设 从现在开始,直到永恒,API永远不会改变。这个 当然是一个非常大胆的假设。但是,大多数项目都有规则 当他们被允许时 break backwards compatibility, 以及当他们向后突破时他们如何更改版本号 兼容性。您可以使用悲观编码对这些版本编号规则进行编码 约束,因此您可以确保您的代码将始终继续工作 (假设另一个项目的作者实际上坚持他自己的 规则,但遗憾的是并非总是如此)。

答案 1 :(得分:13)

换句话说,您可以使用此符号来更新您的宝石所有次要更新,并避免进行可能破坏您的应用程序的重大更新。

例如“〜> 1.2”会将您的gem更新为1.3(如果发布此类版本)但不会将其更新为2.0

答案 2 :(得分:11)

我认为bundler docs最好总结一下:

  

说明符〜>具有特殊意义,通过实例最佳显示。 〜> 2.0.3与> = 2.0.3相同且< 2.1。 〜> 2.1与> = 2.1并且< 3.0。 〜> 2.2.beta将匹配预发布版本,如2.2.beta.12。

答案 3 :(得分:-1)

它匹配具有相同主要/次要部分的任何版本。这意味着在这种情况下haml~> 2.2.8将匹配任何2.2.x版本。

这可以用来确保新宝石中的API破坏变化,不会导致取决于新的但更改的宝石,在这种情况下会破坏汉娜。