สรุปไวยากรณ์สำหรับหมายเลขรุ่น Bower (และ NPM's) เรียกว่า SemVer ซึ่งย่อมาจาก 'Semantic Versioning' คุณสามารถค้นหาเอกสารสำหรับไวยากรณ์ละเอียดของ SemVer ที่ใช้ในสวนและ NPM ใน API สำหรับตัวแยกวิเคราะห์ semver ภายในโหนด คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับสเปคพื้นฐาน (ซึ่งไม่ได้พูดถึง~
หรือรายละเอียดอื่น ๆ ไวยากรณ์) ที่semver.org
มีเครื่องคิดเลขแบบวงกลมที่มองเห็นได้ง่ายที่คุณสามารถเล่นได้ทำให้ง่ายต่อการติดตามและทดสอบ
SemVer ไม่ได้เป็นเพียงไวยากรณ์! มีสิ่งที่น่าสนใจพอสมควรที่จะพูดเกี่ยวกับวิธีที่ถูกต้องในการเผยแพร่ API ซึ่งจะช่วยให้เข้าใจความหมายของไวยากรณ์ ขับเคลื่อน:
เมื่อคุณระบุ API สาธารณะของคุณแล้วคุณจะสามารถสื่อสารการเปลี่ยนแปลงนั้นด้วยการเพิ่มเฉพาะกับหมายเลขเวอร์ชั่นของคุณ พิจารณารูปแบบรุ่นของ XYZ (Major.Minor.Patch) การแก้ไขข้อบกพร่องไม่ส่งผลกระทบต่อ API ที่เพิ่มขึ้นของเวอร์ชันแพตช์, การเพิ่ม / แก้ไข API ที่เข้ากันได้แบบย้อนหลัง, เพิ่มรุ่นรอง, และการเปลี่ยนแปลง API ที่เข้ากันไม่ได้ย้อนหลังเป็นการเพิ่มรุ่นหลัก
ดังนั้นคำถามเฉพาะของคุณเกี่ยวกับที่~
เกี่ยวข้องกับ Major.Minor.Patch schema (เช่นเดียวกับตัวดำเนินการคาเร็ตที่เกี่ยวข้อง^
) คุณสามารถใช้~
เพื่อ จำกัด ช่วงของรุ่นที่คุณยินดียอมรับ:
- ระดับแพตช์ที่ตามมาเปลี่ยนเป็นเวอร์ชั่นย่อยเดียวกัน ( "การแก้ไขข้อบกพร่องที่ไม่ส่งผลกระทบต่อ API" ) หรือ:
- การเปลี่ยนแปลงระดับรองที่ตามมาเป็นเวอร์ชั่นหลักเดียวกัน ( "การเพิ่ม / เปลี่ยนแปลง API ที่เข้ากันได้ย้อนหลัง" )
ตัวอย่างเช่น: เพื่อระบุว่าคุณจะทำการเปลี่ยนแปลงระดับแพตช์ที่ตามมาในทรี 1.2.x โดยเริ่มต้นที่ 1.2.0 แต่น้อยกว่า 1.3.0 คุณสามารถใช้:
"angular": "~1.2"
or:
"angular": "~1.2.0"
สิ่งนี้จะทำให้คุณได้ผลลัพธ์เช่นเดียวกับการใช้.x
ไวยากรณ์:
"angular": "1.2.x"
แต่คุณสามารถใช้ tilde / ~
syntax ให้เจาะจงยิ่งขึ้น: หากคุณเพียงยอมรับการเปลี่ยนแปลงระดับแพตช์เริ่มต้นที่ 1.2.4แต่ยังน้อยกว่า 1.3.0 คุณจะใช้:
"angular": "~1.2.4"
เลื่อนไปทางซ้ายสู่รุ่นหลักหากคุณใช้ ...
"angular": "~1"
... มันเหมือนกับ ...
"angular": "1.x"
or:
"angular": "^1.0.0"
... และจับคู่การเปลี่ยนแปลงระดับรองหรือแพทช์ด้านบน 1.0.0 และน้อยกว่า 2.0:
โปรดทราบว่าการเปลี่ยนแปลงดังกล่าวข้างต้นที่ผ่านมา: ก็เรียกว่า'ลูกศรช่วง' เครื่องหมายรูปหมวกจะมีรูปลักษณ์ที่แย่มาก>
ดังนั้นคุณจะได้รับการยกเว้นเพราะคิดว่ามันหมายถึง "รุ่นใด ๆ ที่สูงกว่า 1.0.0" (ฉันลื่นไปแล้ว) Nope!
โดยทั่วไปช่วงของคาเร็ตจะบอกว่าคุณสนใจเฉพาะตัวเลขที่สำคัญที่สุดทางซ้าย - โดยปกติคือรุ่นหลักและคุณจะอนุญาตให้มีการเปลี่ยนแปลงระดับรองลงมาหรือระดับแพตช์ที่ไม่ส่งผลกระทบกับตัวเลขหลักซ้ายสุดนั้น แต่แตกต่างจากช่วงตัวหนอนที่ระบุรุ่นใหญ่ช่วง caret ช่วยให้คุณระบุจุดเริ่มต้นเล็กน้อย / แพทช์ที่แม่นยำ ดังนั้นในขณะที่^1.0.0 === ~1
ช่วงเครื่องหมายเช่นช่วยให้คุณบอกว่าคุณจะใช้เวลาการเปลี่ยนแปลงใด^1.2.3
ๆ >=1.2.3 && <2.0.0
คุณไม่สามารถทำได้ด้วยช่วงตัวหนอน
ทุกอย่างดูสับสนในตอนแรกเมื่อคุณมองอย่างใกล้ชิด แต่ซูมออกเป็นเวลาหนึ่งวินาทีและคิดแบบนี้: เครื่องหมายรูปหมวกจะช่วยให้คุณพูดได้ว่าคุณเป็นห่วงมากที่สุดเกี่ยวกับตัวเลขสำคัญที่เหลืออยู่ เครื่องหมายตัวหนอนช่วยให้คุณบอกว่าคุณกังวลมากที่สุดว่าตัวเลขใดที่เหมาะสมที่สุดส่วนที่เหลือคือรายละเอียด
มันเป็นพลังแห่งการแสดงออกของตัวหนอนและคาเร็ตที่อธิบายว่าทำไมผู้คนจึงใช้มันมากกว่า.x
ไวยากรณ์ที่เรียบง่ายกว่าพวกเขาเพียงแค่ให้คุณทำมากกว่านั้น นั่นเป็นเหตุผลที่คุณจะเห็นตัวหนอนที่ใช้บ่อยแม้ในที่ที่.x
จะให้บริการ ตัวอย่างเช่นดู npm เอง: ไฟล์ package.json ของตัวเองมีการพึ่งพาใน~2.4.0
รูปแบบมากกว่า2.4.x
รูปแบบที่สามารถใช้ได้ โดยการเกาะติด~
ไวยากรณ์จะสอดคล้องกันตลอดรายการที่มีการอ้างอิงเวอร์ชัน 70+ ขึ้นไปโดยไม่คำนึงถึงหมายเลขแพตช์เริ่มต้นที่เป็นที่ยอมรับ
อย่างไรก็ตามยังมีอีกมากที่ SemVer แต่ฉันจะไม่พยายามอธิบายรายละเอียดทั้งหมดที่นี่ ตรวจสอบออกในโหนด semver readme ของแพคเกจ และให้แน่ใจว่าใช้เครื่องคิดเลขเวอร์ชันความหมายในขณะที่คุณกำลังฝึกซ้อมและพยายามที่จะเข้าใจวิธีการทำงานของ SemVer
RE: หมายเลขเวอร์ชันที่ไม่ต่อเนื่อง: คำถามสุดท้ายของ OP ดูเหมือนจะเกี่ยวกับการระบุหมายเลข / ช่วงเวอร์ชันที่ไม่ต่อเนื่อง (หากฉันได้แก้ไขอย่างเป็นธรรม) ใช่คุณสามารถทำสิ่งที่ใช้ร่วมกันสองครั้งท่อ "หรือ" ||
ผู้ประกอบการ: ชอบมาก
"angular": "1.2 <= 1.2.9 || >2.0.0"