Что означает ~>
требование версии в спецификациях гемов?
hanna-0.1.12 зависит от [haml (~> 2.2.8)]
Что означает ~>
требование версии в спецификациях гемов?
hanna-0.1.12 зависит от [haml (~> 2.2.8)]
Ответы:
В руководстве RubyGems это называется пессимистическим ограничением версии .
Предположим, вы указали n-частный номер версии, например 1.3
(2-частный) или
3.5.6.2
(4-частный) в качестве ограничения. Затем, чтобы выполнить ограничение, номер версии должен удовлетворять обоим из следующих условий
Первые n-1 части номера версии должны быть идентичны первым n-1 частям ограничения (например, 1.x
или 3.5.6.x
совпадать, но 0.x
или 3.5.7.x
нет) и
Последняя часть номера версии должна быть больше или равна последней части ограничения (например, 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 никогда не изменится. Это, конечно, довольно смелое предположение. Однако в большинстве проектов есть правила о том, когда им разрешено
нарушать обратную совместимость и как они должны изменять номер своей версии, когда они действительно нарушают обратную совместимость. Вы можете закодировать эти правила нумерации версий, используя пессимистическое ограничение, и, таким образом, вы можете быть уверены, что ваш код всегда будет продолжать работать (при условии, что автор другого проекта действительно придерживается своих собственных правил, что, к сожалению, не всегда так. ).
Я думаю, что документация по сборке лучше всего резюмирует это:
Спецификатор ~> имеет особое значение, лучше всего показано на примере. ~> 2.0.3 идентичен> = 2.0.3 и <2.1. ~> 2.1 идентичен> = 2.1 и <3.0. ~> 2.2.beta будет соответствовать предварительным версиям, таким как 2.2.beta.12.
Он соответствует любой версии, имеющей такую же основную / вспомогательную часть. В данном случае это означает, что haml ~> 2.2.8 будет соответствовать любой версии 2.2.x.
Это можно использовать, чтобы убедиться, что изменение API-интерфейса в новом геме не приведет к зависимости от этого нового, но измененного драгоценного камня, который в этом случае сломал бы ханну.
~> 2.0
и ~> 2.0.0
- первое соответствует 2.0, 2.1, 2.2.7 и всем остальным до (но не включая) 3.0. Последний соответствует 2.0, 2.0.1, 2.0.999 и всем остальным до (но не включая) 2.1.
~> 2.2.8
будет соответствовать "любая версия 2.2.x", как утверждается в ответе, а только версии 2.2.x с x ≥ 8. IOW: ответ в лучшем случае еще более неполный, граничащий с неправильным и определенно вводящие в заблуждение.