Значение тильды-больше-чем (~>) в требованиях к версии?

94

Что означает ~>требование версии в спецификациях гемов?

hanna-0.1.12 зависит от [haml (~> 2.2.8)]
Алексей Черников
источник
27
Иногда его называют оператором спермы.
Эндрю Гримм
4
или twiddle-wakka
SuckerForMayhem
3
+1 @SuckerForMayhem, тиддл-вакка смешнее. Новая ссылка: guides.rubygems.org/patterns/#pessimistic-version-constraint, которая сама ссылается на robots.oughttbot.com/rubys-pessimistic-operator
The Red Pea
2
@SuckerForMayhem Twiddle-wakka звучит как какой-то легендарный зверь вроде чупакабры. Это был мой вклад в эту тему. Добро пожаловать, общество.
twiz
1
спасибо за обновленные ссылки @TheRedPea
SuckerForMayhem

Ответы:

94

В руководстве RubyGems это называется пессимистическим ограничением версии .

Предположим, вы указали n-частный номер версии, например 1.3(2-частный) или 3.5.6.2(4-частный) в качестве ограничения. Затем, чтобы выполнить ограничение, номер версии должен удовлетворять обоим из следующих условий

  1. Первые n-1 части номера версии должны быть идентичны первым n-1 частям ограничения (например, 1.xили 3.5.6.xсовпадать, но 0.xили 3.5.7.xнет) и

  2. Последняя часть номера версии должна быть больше или равна последней части ограничения (например, 1.9999и 3.5.6.2совпадать, но 1.2или 3.5.6.1нет).

Другими словами

~> х 1. х 2. х 3 . … .X n-2 .x n-1 .x n

совпадения

х 1. х 2. х 3 . … .X n-2 .x n-1 .y, y> = x n

Причина, по которой это называется «пессимистическим» ограничением, а также вариант его использования, заключается в том, что, когда вы просто говорите > x.y.z, вы проявляете оптимизм: вы предполагаете, что с этого момента, вплоть до вечности, API никогда не изменится. Это, конечно, довольно смелое предположение. Однако в большинстве проектов есть правила о том, когда им разрешено нарушать обратную совместимость и как они должны изменять номер своей версии, когда они действительно нарушают обратную совместимость. Вы можете закодировать эти правила нумерации версий, используя пессимистическое ограничение, и, таким образом, вы можете быть уверены, что ваш код всегда будет продолжать работать (при условии, что автор другого проекта действительно придерживается своих собственных правил, что, к сожалению, не всегда так. ).

Йорг В. Миттаг
источник
32
Другими словами: ~> означает, что это разрешит только эту конкретную версию и более новые подверсии в последнем десятичном значении.
Magne
18

Другими словами, вы можете использовать этот символ, чтобы обновлять свой гем со всеми незначительными обновлениями и избегать крупных обновлений, которые могут нарушить работу вашего приложения.

Например, "~> 1.2" обновит ваш гем до 1.3 (если такая версия выпущена), но не до 2.0.

Redjam
источник
13

Я думаю, что документация по сборке лучше всего резюмирует это:

Спецификатор ~> имеет особое значение, лучше всего показано на примере. ~> 2.0.3 идентичен> = 2.0.3 и <2.1. ~> 2.1 идентичен> = 2.1 и <3.0. ~> 2.2.beta будет соответствовать предварительным версиям, таким как 2.2.beta.12.

Ари
источник
1
Боюсь, что нет. Я рад, что принятый ответ объясняет это более подробно. Это объяснение на основе примеров на самом деле не помогает мне понять, что означает оператор.
Tripleee
-1

Он соответствует любой версии, имеющей такую ​​же основную / вспомогательную часть. В данном случае это означает, что haml ~> 2.2.8 будет соответствовать любой версии 2.2.x.

Это можно использовать, чтобы убедиться, что изменение API-интерфейса в новом геме не приведет к зависимости от этого нового, но измененного драгоценного камня, который в этом случае сломал бы ханну.

Диркьян Буссинк
источник
7
Это не неверно, но неполно. Важно недооценивать разницу между ~> 2.0и ~> 2.0.0- первое соответствует 2.0, 2.1, 2.2.7 и всем остальным до (но не включая) 3.0. Последний соответствует 2.0, 2.0.1, 2.0.999 и всем остальным до (но не включая) 2.1.
Джеймс А. Розен
5
@ Джеймс А. Розен: Кроме того, не~> 2.2.8 будет соответствовать "любая версия 2.2.x", как утверждается в ответе, а только версии 2.2.x с x ≥ 8. IOW: ответ в лучшем случае еще более неполный, граничащий с неправильным и определенно вводящие в заблуждение.
Jörg W Mittag