อะไรคือความแตกต่างระหว่าง ~> และ> = เมื่อระบุ Rubygem ใน Gemfile


120

ฉันมักจะเห็นสัญกรณ์ต่อไปนี้ (~>) ใน Gemfile

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

ฉันรู้ว่าเครื่องหมาย (> =) มากกว่าหรือเท่ากับ แต่สัญกรณ์ (~>) หมายถึงอะไร ทั้งสองเหมือนกันหรือมีความแตกต่างอย่างมีนัยสำคัญหรือไม่?


6
ดูเพิ่มเติม: ความหมายของ~>ในความต้องการของรุ่น
Jörg W Mittag

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

3
คุณสามารถระบุช่วงสำหรับเวอร์ชัน Ruby ใน Gemfile ของคุณได้หรือไม่? เช่นruby "~>2.0"
เดนนิส

1
หรือเรียกว่าtwiddle-wakka
SuckerForMayhem

@ เดนนิสนี่คือคำตอบสำหรับคำถามของคุณ: stackoverflow.com/a/23116552/6359753
Henry Yang

คำตอบ:


165

นั่นเป็นข้อ จำกัด ในแง่ร้ายรุ่น RubyGems จะเพิ่มตัวเลขสุดท้ายในเวอร์ชันที่ให้มาและใช้ตัวเลขนั้นจนกว่าจะถึงเวอร์ชันสูงสุด ดังนั้นจึง~>0.8.5มีความหมายเทียบเท่ากับ:

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

วิธีง่ายๆในการคิดก็คือคุณโอเคกับตัวเลขสุดท้ายที่เพิ่มขึ้นเป็นค่าตามอำเภอใจ แต่ตัวเลขที่อยู่ข้างหน้าในสตริงต้องไม่มากกว่าที่คุณระบุไว้ ดังนั้น~>0.8.5ค่าใด ๆ จึงเป็นที่ยอมรับสำหรับหลักที่สาม (5) โดยมีค่ามากกว่าหรือเท่ากับ 5 แต่ 0.8 นำหน้าต้องเป็น "0.8"

ตัวอย่างเช่นคุณอาจทำเช่นนี้หากคุณคิดว่าเวอร์ชัน 0.9 กำลังจะนำการเปลี่ยนแปลงบางอย่างมาใช้ แต่คุณรู้ว่าชุดรีลีส 0.8.x ทั้งหมดเป็นเพียงการแก้ไขข้อบกพร่อง

อย่างไรก็ตามการใช้เพียงแค่">=0.8.5"ระบุว่าเวอร์ชันใด ๆ ที่ช้ากว่า (หรือเท่ากับ) 0.8.5 นั้นยอมรับได้ ไม่มีขอบเขตบน


สิ่งนี้ทำงานอย่างไรกับอัญมณีที่ใช้ตัวเลขสี่หลักสำหรับการกำหนดเวอร์ชันเช่นกระดูกสันหลังบนราง ?
JJD

2
@JJD: โดยพื้นฐานแล้วมันควรจะเป็นพฤติกรรมเดียวกัน ตัวเลขสุดท้ายของทั้งสี่สามารถเพิ่มได้โดยไม่มีขอบเขต แต่ตัวเลขที่สามจะไม่ (ดังนั้น~>0.9.2.3จะอนุญาตสำหรับ v0.9.2.4 หรือ v0.9.2.23 แต่ไม่ใช่ v0.9.3.0) หากคุณระบุเพียง 3 หลักในข้อ จำกัด ตัวเลขที่สี่จะไม่เกี่ยวข้องเป็นหลัก - จะ จำกัด ตามสามตัวแรกที่คุณระบุเท่านั้น (เช่น~>0.9.2จะยอมรับอะไรก็ได้ในชุด 0.9.xy ไม่ว่าyจะเป็นอะไรก็ตามข้อ จำกัด คือ ที่ 9 ไม่สามารถเพิ่มขึ้นได้)
eldarerathis

3
มีข้อยกเว้นสำหรับกฎที่ว่า "RubyGems จะเพิ่มตัวเลขสุดท้ายในเวอร์ชัน" แม้ว่า: เมื่อคุณใส่ตัวเลขหนึ่งหลัก คุณอาจคาดหวังว่า "~> 4" จะหมายถึง "เวอร์ชันใดก็ได้ 4 หรือสูงกว่า" แต่ก็ไม่เป็นเช่นนั้นโปรดใช้ความระมัดระวัง
hlascelles

2
แล้ว ~> 0.1 เทียบกับ ~> 0.1.0 ล่ะ? ถ้าเราคิดว่า "คุณโอเคกับตัวเลขสุดท้ายที่เพิ่มขึ้นเป็นค่าใด ๆ ก็ตาม" ~> 0.1 จะแปลเป็น> = 0.1.0 <1.0.0 ในขณะที่ ~> 0.1.0 แปลเป็น> = 0.1.0 < 0.2.0 ถูกต้องหรือไม่
Wei

เมื่อฉันเห็นโครงการ GitHub แจ้งว่าต้องใช้ทับทิม> = 2.4.4 ฉันสามารถสมมติว่าพวกเขารองรับทับทิมทั้งหมดหลังจาก 2.4.4 รวมถึง 2.5.1 และแม้แต่ทับทิม 3 ได้หรือไม่ หรือเราควรเล่นอย่างปลอดภัย (เช่นแทนที่จะคิดว่าพวกเขาจะรองรับทับทิมทั้งหมดหลังจากรวม 2.4.4 แล้วฉันควรคิดว่าพวกเขาหมายความว่าพวกเขาจะไม่รองรับทับทิมใด ๆ ก่อน 2.4.4)?
Henry Yang

3

@millisami คุณสามารถใช้เพื่อเพิ่มการอ้างอิงกับ gemspec โดยใช้ข้อ จำกัด ในแง่ร้ายเช่นนี้:

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

หากคุณไม่ทราบเกี่ยวกับการพัฒนาอัญมณีมากนักหรือเพิ่งเข้ามามีข้อมูลอ้างอิงที่ดีเหล่านี้:

  1. บทช่วยสอนที่สอนวิธีสร้าง RubyGem ของคุณเองแนวทางปฏิบัติมาตรฐานที่เกี่ยวข้องและวิธีการอัปโหลดเพื่อให้ผู้อื่นสามารถติดตั้งได้
  2. วิธีสร้างอัญมณีตั้งแต่เริ่มต้นด้วย Bundler

1
ลิงค์แรกคือ 404
Petr Gazarov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.