Sự khác biệt giữa ~> và> = khi chỉ định rubygem trong Gemfile là gì?


120

Tôi thường thấy ký hiệu sau (~>) trong Gemfile.

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

Tôi biết dấu (> =) lớn hơn hoặc bằng, nhưng ký hiệu (~>) có nghĩa là gì? Cả hai đều giống nhau hay có bất kỳ sự khác biệt đáng kể nào?



28
~>đôi khi được gọi là "toán tử tinh trùng".
Andrew Grimm

3
Bạn có thể chỉ định một phạm vi cho phiên bản Ruby trong Gemfile của mình không? Ví dụruby "~>2.0"
Dennis

1
hay còn gọi là twiddle-
wakka

@Dennis đây là câu trả lời cho câu hỏi của bạn: stackoverflow.com/a/23116552/6359753
Henry Yang

Câu trả lời:


165

Đó là một hạn chế phiên bản bi quan . RubyGems sẽ tăng chữ số cuối cùng trong phiên bản được cung cấp và sử dụng chữ số đó cho đến khi đạt đến phiên bản tối đa. Vì vậy, về mặt ~>0.8.5ngữ nghĩa tương đương với:

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

Cách dễ dàng để nghĩ về điều đó là bạn không sao với việc chữ số cuối cùng tăng lên một số giá trị tùy ý, nhưng những chữ số đứng trước nó trong chuỗi không được lớn hơn những gì bạn đã cung cấp. Vì vậy ~>0.8.5, bất kỳ giá trị nào cũng có thể chấp nhận được đối với chữ số thứ ba (5) với điều kiện là nó lớn hơn hoặc bằng 5, nhưng 0,8 đứng đầu phải là "0,8".

Bạn có thể làm điều này, ví dụ: nếu bạn nghĩ rằng phiên bản 0.9 sẽ thực hiện một số thay đổi đột phá, nhưng bạn biết toàn bộ loạt bản phát hành 0.8.x chỉ là các bản sửa lỗi.

Tuy nhiên, chỉ cần sử dụng ">=0.8.5"sẽ chỉ ra rằng bất kỳ phiên bản nào sau (hoặc bằng) 0.8.5 đều được chấp nhận. Không có giới hạn trên.


Điều này hoạt động như thế nào với các viên đá quý sử dụng bốn chữ số để lập phiên bản của chúng, chẳng hạn như đường trục ?
JJD

2
@JJD: Về cơ bản nó phải là cùng một hành vi. Chữ số cuối cùng trong bốn chữ số có thể được tăng lên mà không bị ràng buộc, nhưng chữ số thứ ba thì không (như vậy ~>0.9.2.3sẽ cho phép đối với v0.9.2.4 hoặc v0.9.2.23 nhưng không phải v0.9.3.0). Nếu bạn chỉ chỉ định 3 chữ số trong ràng buộc thì chữ số thứ tư về cơ bản không liên quan - nó sẽ chỉ bị hạn chế dựa trên ba chữ số đầu tiên mà bạn chỉ định (ví dụ: ~>0.9.2chấp nhận bất kỳ thứ gì trong chuỗi 0.9.xy, bất kể là gì y; ràng buộc là rằng số 9 không thể tăng lên).
fieldsarerathis 14/11/12

3
Có một ngoại lệ đối với quy tắc "RubyGems sẽ tăng chữ số cuối cùng trong phiên bản": khi bạn cung cấp một chữ số. Bạn có thể mong đợi "~> 4" có nghĩa là "Mọi phiên bản 4 trở lên", nhưng không phải vậy, vì vậy hãy cẩn thận.
hlascelles

2
Còn ~> 0.1 so với ~> 0.1.0 thì sao? Nếu chúng tôi nghĩ nó là "bạn không sao với chữ số cuối cùng tăng lên một số giá trị tùy ý", ~> 0,1 dịch thành> = 0,1.0 <1,0,0 trong khi ~> 0,1.0 dịch thành> = 0,1.0 < 0,2.0. Đúng không?
Wei,

Khi tôi thấy một dự án GitHub nói rằng nó yêu cầu ruby> = 2.4.4, tôi có thể cho rằng họ hỗ trợ tất cả ruby ​​sau 2.4.4 bao gồm 2.5.1 và thậm chí cả ruby ​​3 không? Hay chúng ta nên chơi an toàn (tức là thay vì nghĩ rằng họ sẽ hỗ trợ tất cả ruby ​​sau 2.4.4 bao gồm, tôi nên nghĩ rằng họ có nghĩa là họ sẽ không hỗ trợ bất kỳ ruby ​​nào trước 2.4.4)?
Henry Yang

3

@millisami Bạn thậm chí có thể sử dụng để thêm các phụ thuộc với gemspec bằng cách sử dụng ràng buộc bi quan như sau:

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

Nếu bạn không biết nhiều về phát triển đá quý hoặc chỉ mới bắt đầu làm quen với nó, đây là một số tài liệu tham khảo tốt:

  1. Hướng dẫn dạy bạn cách tạo RubyGem của riêng bạn, các phương pháp tiêu chuẩn liên quan đến nó và cách tải nó lên để người khác có thể cài đặt nó.
  2. Cách tạo Đá quý từ đầu với Bundler

1
Liên kết đầu tiên là số 404
Petr Gazarov.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.