ความหมายของเครื่องหมายทิลเดอร์ - มากกว่า (~>) ในข้อกำหนดเวอร์ชัน?


94

ความหมายของ~>เวอร์ชันข้อกำหนดในรายละเอียดอัญมณีคืออะไร?

hanna-0.1.12 ขึ้นอยู่กับ [haml (~> 2.2.8)]

27
บางครั้งเรียกว่าตัวดำเนินการที่น่ากลัว
Andrew Grimm


3
+1 @SuckerForMayhem "twiddle-wakka" สนุกกว่า ลิงค์ใหม่: guide.rubygems.org/patterns/#pessimistic-version-constraint - ซึ่งเชื่อมโยงไปยังrobots.thoughtbot.com/rubys-pessimistic-operator
The Red Pea

2
@SuckerForMayhem Twiddle-wakka ดูเหมือนสัตว์ในตำนานบางชนิดเช่น chupacabra นี่เป็นการมีส่วนร่วมของฉันในหัวข้อนี้ คุณยินดีต้อนรับสังคม
twiz

1
ขอบคุณสำหรับลิงค์ที่อัปเดต @TheRedPea
SuckerForMayhem

คำตอบ:


94

RubyGems โทรคู่มือนี้ ในแง่ร้ายรุ่น จำกัด

สมมติว่าคุณได้ระบุหมายเลขเวอร์ชัน n-part เช่น1.3(2-part) หรือ 3.5.6.2(4-part) เป็นข้อ จำกัด จากนั้นเพื่อให้เป็นไปตามข้อ จำกัด หมายเลขเวอร์ชันต้องเป็นไปตามเงื่อนไขทั้งสองต่อไปนี้

  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

ฉันคิดว่าเอกสาร Bundlerสรุปได้ดีที่สุด:

ตัวระบุ ~> มีความหมายพิเศษแสดงโดยตัวอย่างได้ดีที่สุด ~> 2.0.3 เหมือนกับ> = 2.0.3 และ <2.1 ~> 2.1 เหมือนกับ> = 2.1 และ <3.0 ~> 2.2.beta จะตรงกับเวอร์ชันก่อนวางจำหน่ายเช่น 2.2.beta.12


1
ฉันกลัวว่าจะไม่ทำ ฉันยินดีที่คำตอบที่ได้รับการยอมรับจะอธิบายรายละเอียดเพิ่มเติมนี้ คำอธิบายตามตัวอย่างนี้ไม่ได้ช่วยให้ฉันเข้าใจความหมายของตัวดำเนินการ
tripleee

-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 A. Rosen: นอกจากนี้~> 2.2.8จะไม่ตรงกับ "2.2.x" เวอร์ชันใด ๆ ตามที่คำตอบอ้าง แต่มีเพียงเวอร์ชัน 2.2.x ที่มี x ≥ 8 IOW: คำตอบนั้นดีที่สุดยิ่งไม่สมบูรณ์มากขึ้นมีขอบไม่ถูกต้องและแน่นอน ทำให้เข้าใจผิด
Jörg W Mittag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.