Ý nghĩa của dấu ngã-lớn hơn (~>) trong yêu cầu phiên bản?


92

Ý nghĩa của ~>yêu cầu phiên bản trong thông số kỹ thuật đá quý là gì?

hanna-0.1.12 phụ thuộc vào [haml (~> 2.2.8)]

27
Nó đôi khi được gọi là toán tử tinh trùng.
Andrew Grimm

4
hoặc twiddle-
wakka

3
+1 @SuckerForMayhem, "twiddle-wakka" hài hước hơn. Liên kết mới: Guide.rubygems.org/patterns/#pessimistic-version-constraint - bản thân nó liên kết đến robots.thoughtbot.com/rubys-pessimistic-operator
The Red Pea

2
@SuckerForMayhem Twiddle-wakka nghe giống như một loại quái thú huyền thoại nào đó như chupacabra. Đây là đóng góp của tôi cho chủ đề. Bạn được xã hội chào đón.
twiz 12/09/19

1
thx cho các liên kết được cập nhật @TheRedPea
SuckerForMayhem.

Câu trả lời:


93

Hướng dẫn sử dụng RubyGems gọi đây là một ràng buộc phiên bản bi quan .

Giả sử bạn đã chỉ định số phiên bản n phần, ví dụ 1.3(2 phần) hoặc 3.5.6.2(4 phần) làm ràng buộc. Sau đó, để đáp ứng ràng buộc, số phiên bản phải thỏa mãn cả hai điều kiện sau

  1. N-1 phần đầu tiên của số phiên bản phải giống với n-1 phần đầu tiên của ràng buộc (ví dụ: 1.xhoặc 3.5.6.xkhớp, nhưng 0.xhoặc 3.5.7.xkhông)

  2. Phần cuối cùng của số phiên bản phải lớn hơn hoặc bằng phần cuối cùng của ràng buộc (ví dụ 1.99993.5.6.2khớp, nhưng 1.2hoặc 3.5.6.1không).

Nói cách khác

~> x 1 .x 2 .x 3 . … .X n-2 .x n-1 .x n

diêm

x 1 .x 2 .x 3 . … .X n-2 .x n-1 .y, y> = x n

Lý do điều này được gọi là ràng buộc "bi quan", và cũng là trường hợp sử dụng cho nó, là khi bạn vừa nói > x.y.z, bạn đang lạc quan: bạn giả định rằng từ đây trở đi, cho đến muôn đời, API sẽ không bao giờ thay đổi. Tất nhiên đây là một giả định khá táo bạo. Tuy nhiên, hầu hết các dự án có quy tắc về việc khi nào họ được phép phá vỡ khả năng tương thích ngược , và làm thế nào họ phải thay đổi số phiên bản của họ khi họ làm khả năng tương thích ngược nghỉ ngơi. Bạn có thể mã hóa các quy tắc đánh số phiên bản đó bằng cách sử dụng một ràng buộc bi quan và do đó bạn có thể chắc chắn rằng mã của mình sẽ luôn hoạt động (giả sử rằng tác giả của dự án khác thực sự tuân thủ các quy tắc của riêng mình, điều này rất tiếc là không phải lúc nào cũng vậy ).


32
Nói cách khác: ~> có nghĩa là nó sẽ chỉ cho phép phiên bản cụ thể đó và các phiên bản con mới hơn ở số thập phân cuối cùng.
Magne

18

Nói cách khác, bạn có thể sử dụng biểu tượng này để giữ cho viên ngọc của mình được cập nhật tất cả các bản cập nhật nhỏ và tránh thực hiện một bản cập nhật lớn có thể làm hỏng ứng dụng của bạn.

Ví dụ: "~> 1.2" sẽ cập nhật gem của bạn lên 1.3 (nếu phiên bản như vậy được phát hành) nhưng nó sẽ không cập nhật lên 2.0


13

Tôi nghĩ rằng tài liệu về gói tổng hợp tốt nhất là:

Từ bổ nghĩa ~> có ý nghĩa đặc biệt, được thể hiện rõ nhất bằng ví dụ. ~> 2.0.3 giống với> = 2.0.3 và <2.1. ~> 2.1 giống với> = 2.1 và <3.0. ~> 2.2.beta sẽ khớp với các phiên bản phát hành trước như 2.2.beta.12.


1
Tôi e là không. Tôi rất vui vì câu trả lời được chấp nhận giải thích điều này chi tiết hơn. Giải thích dựa trên ví dụ này không thực sự giúp tôi hiểu toán tử nghĩa là gì.
tripleee

-1

Nó phù hợp với bất kỳ phiên bản nào có cùng phần chính / phụ. Điều này có nghĩa là trong trường hợp này, haml ~> 2.2.8 sẽ khớp với bất kỳ phiên bản 2.2.x nào.

Điều này có thể được sử dụng để đảm bảo rằng một thay đổi phá vỡ API trong một viên ngọc mới, không dẫn đến việc phụ thuộc vào viên ngọc mới nhưng đã thay đổi đó sẽ phá vỡ hanna trong trường hợp này.


7
Điều này không sai, nhưng nó không đầy đủ. Điều quan trọng là phải nhấn mạnh sự khác biệt giữa ~> 2.0~> 2.0.0- các trận đấu trước đây 2.0, 2.1, 2.2.7 và mọi thứ khác cho đến (nhưng không bao gồm) 3.0. Cái sau phù hợp với 2.0, 2.0.1, 2.0.999 và mọi thứ khác lên đến (nhưng không bao gồm) 2.1.
James A. Rosen

5
@James A. Rosen: Ngoài ra, ~> 2.2.8sẽ không khớp với "bất kỳ phiên bản 2.2.x nào" như câu trả lời tuyên bố, mà chỉ có phiên bản 2.2.x với x ≥ 8. IOW: câu trả lời tốt nhất là thậm chí còn chưa hoàn chỉnh, có nghĩa là không chính xác và chắc chắn gây hiểu lầm.
Jörg W Mittag
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.