Apa perbedaan antara ~> dan> = saat menentukan rubygem di Gemfile?

120

Saya sering melihat notasi berikut (~>) di Gemfile.

gem "cucumber", "~>0.8.5"
gem "rspec", "~>1.3.0"

Saya tahu tanda (> =) lebih besar atau sama dengan, tapi apa arti notasi (~>)? Apakah keduanya sama atau memiliki perbedaan yang signifikan?

Otodidak
sumber
6
Lihat juga: Arti ~>dalam persyaratan versi .
Jörg W Mittag
28
~>kadang-kadang disebut sebagai "operator sperma".
Andrew Grimm
3
Bisakah Anda menentukan range untuk versi Ruby di Gemfile Anda? Misalnyaruby "~>2.0"
Dennis
1
atau disebut twiddle-wakka
SuckerForMayhem
@Dennis di sini adalah jawaban untuk pertanyaan Anda: stackoverflow.com/a/23116552/6359753
Henry Yang

Jawaban:

165

Itu adalah batasan versi yang pesimis . RubyGems akan menaikkan digit terakhir dalam versi yang disediakan dan menggunakannya hingga mencapai versi maksimum. Jadi ~>0.8.5secara semantik setara dengan:

gem "cucumber", ">=0.8.5", "<0.9.0"

Cara mudah untuk memikirkannya adalah Anda tidak masalah dengan digit terakhir yang bertambah ke beberapa nilai arbitrer, tetapi digit sebelumnya dalam string tidak boleh lebih besar dari yang Anda berikan. Jadi ~>0.8.5, nilai apa pun dapat diterima untuk digit ketiga (5) asalkan lebih besar dari atau sama dengan 5, tetapi 0,8 di depan harus "0.8".

Anda dapat melakukan ini, misalnya, jika Anda berpikir bahwa versi 0.9 akan menerapkan beberapa perubahan yang mengganggu, tetapi Anda tahu bahwa seluruh seri rilis 0.8.x hanyalah perbaikan bug.

Namun, hanya menggunakan ">=0.8.5"akan menunjukkan bahwa setiap versi dari (atau sama dengan) 0.8.5 dapat diterima. Tidak ada batasan atas.

eldarerathis
sumber
Bagaimana ini berperilaku dengan permata yang menggunakan empat digit untuk versinya seperti tulang punggung-di-rel ?
JJD
2
@ JJD: Ini pada dasarnya harus perilaku yang sama. Digit terakhir dari empat dapat bertambah tanpa batas, tetapi digit ketiga tidak (sehingga ~>0.9.2.3memungkinkan untuk v0.9.2.4 atau v0.9.2.23 tetapi tidak untuk v0.9.3.0). Jika Anda hanya menentukan 3 digit dalam batasan maka yang keempat pada dasarnya tidak relevan - itu hanya akan dibatasi berdasarkan tiga digit pertama yang Anda tentukan (misalnya ~>0.9.2akan menerima apa pun dalam rangkaian 0,9.xy, terlepas dari apa y; batasannya adalah bahwa angka 9 tidak dapat ditambah).
eldarerathis
3
Ada pengecualian untuk aturan bahwa "RubyGems akan menaikkan digit terakhir dalam versi": ketika Anda memberikan satu digit. Anda mungkin berharap "~> 4" berarti "Semua versi 4 atau lebih tinggi", tetapi ternyata tidak , jadi berhati-hatilah.
hlascelles
2
Bagaimana dengan ~> 0.1 vs. ~> 0.1.0? Jika kita menganggapnya sebagai "Anda baik-baik saja dengan digit terakhir bertambah menjadi beberapa nilai arbitrer", ~> 0.1 diterjemahkan menjadi> = 0.1.0 <1.0.0 sementara ~> 0.1.0 diterjemahkan menjadi> = 0.1.0 < 0.2.0. Apakah itu benar?
Wei
Ketika saya melihat proyek GitHub mengatakan itu membutuhkan ruby> = 2.4.4, dapatkah saya menganggap mereka mendukung semua ruby ​​setelah 2.4.4 termasuk 2.5.1 dan bahkan ruby ​​3? Atau haruskah kita bermain aman (yaitu, alih-alih berpikir mereka akan mendukung semua ruby ​​setelah 2.4.4 inklusif, saya harus berpikir bahwa mereka berarti mereka tidak akan mendukung ruby ​​sebelum 2.4.4)?
Henry Yang
3

@millisami Anda bahkan dapat menggunakan untuk menambahkan dependensi dengan gemspec menggunakan batasan pesimis seperti ini:

gem.add_runtime_dependency "thor", "~> 0.18.1"

Jika Anda tidak tahu banyak tentang pengembangan permata atau baru memahaminya, berikut adalah beberapa referensi yang bagus:

  1. Tutorial yang mengajarkan Anda cara membuat RubyGem Anda sendiri, praktik standar yang terkait dengannya, dan cara mengunggahnya agar orang lain dapat menginstalnya.
  2. Cara membuat Permata dari awal dengan Bundler
strangeloops
sumber
1
Tautan pertama adalah 404
Petr Gazarov