Значення тильди-більше-ніж (~>) у вимозі до версії?


92

Що означає ~>вимога до версії в специфікаціях gem?

hanna-0,1.12 залежить від [haml (~> 2.2.8)]

27
Його іноді називають оператором сперми.
Ендрю Грімм,


3
+1 @SuckerForMayhem, "twiddle-wakka" смішніше. Нове посилання: guides.rubygems.org/patterns/#pessimistic-version-constraint - яке саме посилається на robots.thoughtbot.com/rubys-pessimistic-operator
Червоний горошок

2
@SuckerForMayhem Twiddle-wakka звучить як якийсь легендарний звір, як чупакабра. Це мій внесок у тему. Вас вітає суспільство.
твіз

1
thx за оновлені посилання @TheRedPea
SuckerForMayhem

Відповіді:


93

Посібник 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ні).

Іншими словами

~> 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 ніколи не зміниться. Звичайно, це досить сміливе припущення. Тим НЕ менше, більшість проектів мають правила про те, коли вони можуть порушити зворотну сумісність , і як вони повинні змінити свій номер версії , коли вони роблять сумісності перерву в зворотному напрямку. Ви можете кодувати ці правила нумерації версій, використовуючи песимістичне обмеження, і, таким чином, ви можете бути впевнені, що ваш код буде продовжувати працювати (припускаючи, що автор іншого проекту насправді дотримується своїх власних правил, що, на жаль, не завжди має місце) ).


32
Іншими словами: ~> означає, що він дозволить лише ту конкретну версію та новіші підверсії в останньому десятковому коді.
Magne

18

Іншими словами, ви можете використовувати цей символ, щоб постійно оновлювати ваш дорогоцінний камінь усіма незначними оновленнями та уникати серйозного оновлення, яке може зламати ваш додаток.

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


13

Я думаю, що пакети документів найкраще підсумовують це:

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


1
Боюсь, що ні. Я радий, що прийнята відповідь пояснює це більш докладно. Це пояснення на прикладі не дуже допомагає мені зрозуміти, що означає оператор.
триплеє

-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.
James A. Rosen

5
@James А. Розен: Крім того , ~> 2.2.8буде НЕ відповідати «будь-2.2.x» варіант в якості претензій відповіді, але тільки 2.2.x версії з х ≥ 8. IOW: відповідь в кращому випадку ще більш неповним, що межує з неправильним і , безумовно , вводить в оману.
Jörg W Mittag
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.