ไวยากรณ์เวอร์ชันของ bower (และ npm) คืออะไร


274

Bower ช่วยให้ฉันสามารถระบุข้อกำหนดรุ่นสำหรับแพ็คเกจโดยใช้ไวยากรณ์ต่อไปนี้:

"dependencies": {
  "<name>": "<version>",
},

แต่ฉันไม่สามารถค้นหาสิ่งที่เป็นไวยากรณ์ที่ใช้สำหรับ <version>แต่ผมยังไม่ได้รับสามารถที่จะหาสิ่งที่เป็นไวยากรณ์ที่จะใช้สำหรับฉันรู้ว่าฉันสามารถระบุรุ่นเป็น:

  • มากกว่ารุ่นที่แน่นอนด้วย ">1.0.0"
  • มากกว่าหรือเท่ากับรุ่น: ">=1.0.0"
  • หรือในบางช่วง: "1.0.0 - 2.0.0".

"~1.0.0"ฉันยังรู้ว่ามีไวยากรณ์รุ่นทั่วไปที่มีตัวหนอน: "=1.0.0"แต่ผมไม่แน่ใจว่ามันหมายถึงอะไรและไม่ว่าจะเป็นเช่นเดียวกับ

นอกจากนี้ผมยังสนใจที่จะรู้ว่าฉันสามารถที่จะระบุรุ่นไม่ต่อเนื่องกันหลายอย่างเช่นว่า1.0.3รุ่นบวกมากกว่า1.5.0ฯลฯ ...


3
นี่อาจเป็นไฟล์ซ้ำซ้อนของstackoverflow.com/a/19040351/537738
David

คำตอบ:


341

สรุปไวยากรณ์สำหรับหมายเลขรุ่น 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"

27
ดังนั้น~ในวิธีการโดยเฉพาะแพทช์จำนวน (สาม) อาจจะมากกว่ามากกว่าหนึ่งที่ระบุไว้เช่นเทียบเท่ากับ~1.2.3 >=1.2.3 <1.3.0
z0r

1
สามารถใช้สำหรับหมายเลขรอง (วินาที) ต่อการแก้ไขแบบอินไลน์ข้างต้น
XML

น่าสนใจว่าเอกสารของ SemVer ดูเหมือนว่าจะอนุญาตให้ใช้สัญลักษณ์ x (ซึ่งเป็นสิ่งที่มนุษย์เข้าใจได้ง่ายกว่า)
Frank Nocke

2
x-notation อ่านง่ายในตอนแรก แต่มีความยืดหยุ่นน้อยกว่ามาก '1.1.x' === '>=1.1.0' === '~1.1.0'ยกตัวอย่างเช่น เคส 1.1.0 นั้นง่าย แต่ x-สัญกรณ์ไม่สามารถเป็นเม็ดที่สามารถหรือ'>=1.1.4' '~1.1.4'ดังนั้นคุณจึงปิดท้ายด้วยที่'1.1.x'เดียวในรายการพึ่งพาของคุณและ'~2.7.3'ในที่อื่น ไม่เป็นไรและใช้งานได้ แต่ผู้พัฒนาจำเป็นต้องวิเคราะห์ไวยากรณ์หลายรายการเพื่ออ่านรายการเดียว และหากคุณกำลังเขียนแพ็คเกจเพื่อตั้งเวอร์ชันโดยทางโปรแกรมคุณต้องการไวยากรณ์เดียว และคนส่วนใหญ่ต้องการที่จะป้องกันไม่ให้เกิดการเปลี่ยนแปลง ~ดังนั้นทุกปัญหาแก้ไขได้ด้วย
XML

1
ฮะ ฉันคิดว่า "grok" มีพื้นที่ทางภูมิศาสตร์น้อยกว่าวัฒนธรรมที่ไม่สว่าง (และอาจเกี่ยวข้องกับอายุ) @Clonkex สำหรับผู้อ่านในอนาคต: เป็นการอ้างอิงถึงคนแปลกหน้าของไฮนลินในดินแดนแปลก ...
XML

141

ขึ้นอยู่กับsemverคุณสามารถใช้

  • ช่วงยัติภังค์ XYZ - ABC 1.2.3-2.3.4 บ่งชี้> = 1.2.3 <= 2.3.4

  • X-ช่วง 1.2.x 1.X 1.2.*

  • Tilde Ranges ~1.2.3 ~1.2 ระบุว่าอนุญาตให้มีการเปลี่ยนแปลงระดับแพตช์หรือเปลี่ยนเวอร์ชั่นรอง

  • ช่วงแคเร็ต ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    อนุญาตการเปลี่ยนแปลงที่ไม่แก้ไขตัวเลขซ้ายสุดที่ไม่ใช่ศูนย์ใน tuple [Major, minor, patch]

    • ^1.2.x (หมายถึง> = 1.2.0 <2.0.0)
    • ^0.0.x (หมายถึง> = 0.0.0 <0.1.0)
    • ^0.0 (หมายถึง> = 0.0.0 <0.1.0)

21
ขอบคุณสำหรับคำตอบที่ไร้สาระและง่ายต่อการอ่าน ฉันไม่จำเป็นต้องติดตามกลับหรืออะไรเลยบูมมันมีคำตอบ ทำได้ดี;)
toddmo

76

Bower ใช้ไวยากรณ์ของ semverแต่นี่คือตัวอย่างรวดเร็ว:

คุณสามารถติดตั้งรุ่นเฉพาะ:

$ bower install jquery#1.11.1

คุณสามารถใช้ ~ เพื่อระบุ 'เวอร์ชันใด ๆ ที่ขึ้นต้นด้วยสิ่งนี้':

$ bower install jquery#~1.11

คุณสามารถระบุข้อกำหนดของรุ่นหลาย ๆ

$ bower install "jquery#<2.0 >1.10"

1
ฉันอยากรู้เกี่ยวกับการใช้งานจริงนี้ การติดตั้งรูเล็ต?
gravidThoughts

ดูคำตอบของ @ XMLilley (และเอกสาร semver) 'เริ่มต้นด้วย' ดูเหมือนผิดเนื่องจาก 1.12, 1.13 ก็จะไม่เป็นไรตราบใดที่เวอร์ชันหลักไม่ขึ้น ...
Frank Nocke

13

นอกจากนี้คุณยังสามารถใช้latestคำหลักเพื่อติดตั้งเวอร์ชันล่าสุดที่มี:

  "dependencies": {
    "fontawesome": "latest"
  }

1
semverไม่ได้พูดถึงสิ่งนี้ คุณสร้างที่ถูกต้องที่ไหน :) มันบอกว่า " "*" := >=0.0.0(เวอร์ชั่นใดตรงกับความพอใจ)" ซึ่งอยู่ใกล้ แต่ค่อนข้างคลุมเครือเนื่องจากไม่ได้ระบุว่าเฉพาะเจาะจงล่าสุดดังนั้นจึงอาจเป็นอันดับแรกที่พบ
GazB

พูดตามตรงมันเป็นแค่การลองผิดลองถูก - ฉันลองแล้วก็ใช้งานได้! คุณอาจถูกต้องว่ามันไม่ถูกต้อง 100% แต่ใช้งานได้
shacker

7

หากไม่มีหมายเลขแพตช์~เทียบเท่ากับการผนวก.xเข้ากับเวอร์ชันที่ไม่ใช่ตัวหนอน หากมีหมายเลขชุดแก้ไข~ให้อนุญาตหมายเลขชุดโปรแกรมแก้ไขทั้งหมด> = หมายเลขที่ระบุ

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

ฉันมีคะแนนไม่เพียงพอที่จะแสดงความคิดเห็นเกี่ยวกับคำตอบที่ยอมรับ แต่ข้อมูลตัวหนอนบางตัวมีความขัดแย้งกับเอกสารของเซมที่เชื่อมโยง: "angular": "~1.2"จะไม่ตรงกับ 1.3, 1.4, 1.4.9 นอกจากนี้"angular": "~1"และ"angular": "~1.0"มีไม่เทียบเท่า นี้สามารถตรวจสอบได้ด้วยNPM semver เครื่องคิดเลข

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