2010-11-27 30 views
101

Tôi thường thấy ký hiệu sau (~>) trong Gemfile.Sự khác nhau giữa ~> và> = khi chỉ định rubygem trong Gemfile là gì?

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

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

+6

Xem thêm: [Ý nghĩa của '~>' trong yêu cầu phiên bản] (http://StackOverflow.Com/q/3414337/#3416289). –

+20

'~>' đôi khi được gọi là "nhà điều hành tinh trùng". –

+2

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

Trả lời

141

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

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

Cách đơn giản để suy nghĩ về nó là bạn đang okay với chữ số cuối cùng incrementing một số giá trị tùy ý, nhưng những người trước đó trong chuỗi không có thể lớn hơn những gì bạn cung cấp. Vì vậy, đối với ~>0.8.5, bất kỳ giá trị nào đều được chấp nhận cho chữ số thứ ba (số 5) với điều kiện là nó lớn hơn hoặc bằng 5, nhưng giá trị 0,8 đầu tiên 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ộ chuỗi phát hành 0.8.x chỉ là các sửa lỗi.

Tuy nhiên, chỉ cần sử dụng ">=0.8.5" sẽ cho biết 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.

+0

Cách này hoạt động với đá quý sử dụng bốn chữ số cho phiên bản của chúng, chẳng hạn như [xương sống -on-ray] (https://github.com/meleyal/backbone-on-rails)? – JJD

+2

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

+2

Có một ngoại lệ đối với quy tắc rằng "RubyGems sẽ tăng số cuối cùng trong phiên bản" mặc dù: 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 [nó không] (http://stackoverflow.com/questions/24121960/why-does-the-gemfile-semantic-versioning- điều hành-sản xuất-không phù hợp-resu), vì vậy hãy cẩn thận. – hlascelles

2

@millisami Bạn thậm chí có thể sử dụng để thêm phụ thuộc với gemspec sử dụng hạn chế bi quan như thế này:

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ỉ nhận được vào nó, đây là một số tài liệu tham khảo tốt:

  1. Tutorial that teaches you how to make your own RubyGem, the standard practices associated with it, and how to upload it so that others can install it.
  2. How to create a Gem from scratch with Bundler
+0

Liên kết đầu tiên là 404 –

Các vấn đề liên quan