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

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

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

Ответ 1

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

Предположим, вы указали номер версии n-part, например. 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 do not).

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

~> x_1.x_2.x_3. … .x_n-2.x_n-1.x_n

совпадения

x_1.x_2.x_3. … .x_n-2.x_n-1.y, y = x_n

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

Ответ 2

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

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

Ответ 3

Я думаю, bundler docs лучше всего подводит итог:

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

Ответ 4

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

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