ข้อแตกต่างระหว่าง tilde (~) และ caret (^) ใน package.json คืออะไร


3383

หลังจากที่ผมอัพเกรดล่าสุดที่มีเสถียรภาพnodeและผมพยายามnpm npm install moment --saveมันบันทึกรายการในpackage.jsonด้วย^คำนำหน้าcaret ก่อนหน้านี้มันเป็น~คำนำหน้าตัวหนอน

  1. ทำไมการเปลี่ยนแปลงเหล่านี้ทำในnpm?
  2. ความแตกต่างระหว่างตัวหนอน~และคาเร็ต^คืออะไร?
  3. อะไรคือข้อดีกว่าคนอื่น ๆ ?

42
FYI npm config set save-prefix=''คุณสามารถป้องกันคำนำหน้าหรือใช้อย่างใดอย่างหนึ่งที่กำหนดเองโดยการทำ: (ติด~อยู่ในเครื่องหมายคำพูดหากเป็นสิ่งที่คุณต้องการ) ฉันทำสิ่งนี้เป็นการส่วนตัวและหดห่อสิ่งต่าง ๆ ในการผลิต
fncomp

19
รายละเอียดเกี่ยวกับวิธีการทำงานของตัวหนอนและตัวอ่อนและความแตกต่าง: github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
เครื่องมือนี้เป็นผู้ช่วยที่ดีในการทดสอบsemver.npmjs.com
chaiyachaiya

@fncomp เพียงแค่ต้องการชี้แจงหากฉันได้รับความคิดเห็นของคุณถูกต้อง .. คุณใช้การอ้างอิงเฉพาะรุ่นในโครงการของคุณหรือไม่ ทีมงานของเราลังเลที่จะอัพเกรดการพึ่งพา .. คุณอยากจะแนะนำให้ใช้เวอร์ชั่นเฉพาะหรือส่วนนำหน้า '~' สำหรับการพึ่งพา .. ?
blogs4t

@fncomp คุณช่วยอธิบายรายละเอียดว่าคุณหมายถึงอะไรโดยพูดว่า "ฉันทำสิ่งนี้เป็นการส่วนตัวและหดตัวเพื่อสิ่งต่าง ๆ ในการผลิต" ขอบคุณ!
blogs4t

คำตอบ:


3842

ดูเอกสาร NPMและเอกสาร semver

~ version“ ประมาณเทียบเท่ากับ version” จะอัปเดตคุณเป็นเวอร์ชันแพตช์ในอนาคตทั้งหมดโดยไม่เพิ่มรุ่นรอง ~1.2.3จะใช้รีลีสจาก 1.2.3 ถึง <1.3.0

^ version“ ใช้งานได้กับเวอร์ชั่น” จะอัปเดตคุณเป็นรุ่นรอง / แพทช์ในอนาคตทั้งหมดโดยไม่ต้องเพิ่มรุ่นหลัก ^2.3.4จะใช้รีลีสจาก 2.3.4 ถึง <3.0.0

ดูความคิดเห็นด้านล่าง


325
การโพสต์ที่นี่เพื่อหวังว่าจะได้จับคนที่ไม่ได้คิดเรื่องนี้มาก่อน แต่ทั้ง ^ และ ~ จะถือว่าคุณสามารถไว้วางใจการเปิดตัวเล็กน้อยและการเปิดเผยจุดจากการอ้างอิงของคุณ หากคุณกำลังเผยแพร่ห้องสมุดและต้องการให้คนอื่น ๆ เชื่อใจคุณไม่ต้องยอมรับผู้รับฝากข่าวของ Downstream การปล่อยจุดที่ไม่ดีจากการขึ้นต่อกันของคุณอาจทำให้เกิดปฏิกิริยาลูกโซ่ด้านบนและจะมีคนเคาะประตูของคุณเมื่อสิ่งต่าง ๆ รูปร่างลูกแพร์ นี่เป็นอีกเหตุผลใหญ่ที่ใช้ npm ตัวย่อในรหัสการผลิตของคุณ
tehfoo

8
นอกจากนี้คุณยังสามารถเพียงแค่ทำไปด้วยเรื่องไร้สาระทั้งหมดของ NPM prepending รุ่นของคุณด้วยหรือ^ ~ตั้งค่านี้หากคุณต้องการควบคุมเวอร์ชันของคุณอย่างเข้มงวด: npm config set save-prefix=''
kumarharsh

5
@prasanthv ถูกต้อง: จากdocs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0 0.4 อนุญาตการเปลี่ยนแปลงที่ไม่แก้ไขตัวเลขซ้ายสุดที่ไม่ใช่ศูนย์ใน tuple [Major, minor, patch] กล่าวอีกนัยหนึ่งนี่เป็นการอนุญาตให้มีการอัปเดตแพตช์และรองสำหรับเวอร์ชัน 1.0.0 และสูงกว่าอัปเดตแพตช์สำหรับเวอร์ชั่น 0.X> = 0.1.0 และไม่มีการอัปเดตสำหรับรุ่น 0.0.X
rofrol

15
@jgillich ใน semver เมื่อคุณใช้0.2.x, ไม่ได้เป็น2 major versionนั่นเป็นเหตุผลที่docs.npmjs.comthe left-most non-zero digitใช้คำที่เฉพาะเจาะจง: สิ่งที่เกี่ยวกับกรณีนี้: ^ 0.0.4 หมายถึง 0.0.4
rofrol

11
@FagnerBrack: ตัวอย่างเฉพาะที่คุณให้นั้นถูกต้อง แต่โดยทั่วไปวิธีคิดของคุณผิด ตัวอย่าง: สมมติว่าคุณมีแพคเกจAใน 3 รุ่น: 0.0.1, และ0.0.2 0.0.3มีข้อผิดพลาดในการเป็น0.0.1ดังนั้นคุณจึงต้องการที่จะมีอย่างน้อยในแพคเกจของคุณ0.0.2 Bถ้าคุณเขียน0.0.xคุณจะได้รับ0.0.3ซึ่งก็โอเค แต่ถ้าแพ็คเกจอื่นCจำเป็นต้องใช้ทั้งสองอย่างBและAยังมีข้อ จำกัด"A": "<0.0.2"คุณจะได้รับ0.0.1โดยไม่แสดงปัญหาความขัดแย้งซึ่งไม่ใช่สิ่งที่คุณต้องการ การใช้เครื่องหมายตัวหนอน~0.0.2จะช่วยคุณหลีกเลี่ยงปัญหานี้
Maciej Sz

861

ฉันต้องการเพิ่มเอกสาร npmjs อย่างเป็นทางการซึ่งอธิบายวิธีการทั้งหมดสำหรับความเฉพาะเจาะจงของรุ่นรวมถึงที่อ้างถึงในคำถาม -

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version"โดยประมาณที่เทียบเท่ากับเวอร์ชัน" ดูเซมพ์ npm - ช่วงตัวหนอน & เซม (7)
  • ^version"เข้ากันได้กับรุ่น" ดูเซกเตอร์ npm - ช่วง Caret & semver
  • version ต้องตรงกับรุ่นทุกประการ
  • >version ต้องมากกว่ารุ่น
  • >=version ฯลฯ
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1 เป็นต้น แต่ไม่ใช่ 1.3.0
  • http://sometarballurl (นี่อาจเป็น URL ของ tarball ซึ่งจะดาวน์โหลดและติดตั้งในเครื่อง
  • * ตรงกับรุ่นใดก็ได้
  • latest รับรุ่นล่าสุด

รายการด้านบนไม่ครบถ้วนสมบูรณ์ ตัวระบุรุ่นอื่น ๆ รวมถึง URL ของ GitHub และ GitHub user repo's พา ธ และแพ็กเกจท้องถิ่นที่มีแท็ก npm เฉพาะ


8
นอกจากนี้ยังเป็นไปได้ที่จะระบุช่วงที่แน่นอนของรุ่นเช่น1.2.0 || >=1.2.2 <1.3.0: อย่างแน่นอน 1.2.0 หรือทุกอย่างตั้งแต่ 1.2.2 ถึง 1.3.0 (รวม) แต่ไม่ใช่ 1.2.1 หรือ 1.3.1 และสูงกว่าและไม่ใช่ 1.1 .x และด้านล่าง
CodeManX

ลิงก์ที่เฉพาะเจาะจงมากขึ้นเป็นรูปแบบด้านบน -> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version"และ"Compatible with version"เป็นวิธีที่ไม่เฉพาะเจาะจงอย่างน่าผิดหวังในการอธิบายพฤติกรรม ~ และ ^ ขอบคุณ @jgillich ที่ให้คำตอบจริง!
Scott Stafford

636

npm อนุญาตให้ติดตั้งแพ็คเกจเวอร์ชันที่ใหม่กว่าที่ระบุไว้ การใช้ tilde ( ~) ช่วยให้คุณแก้ไขข้อผิดพลาดในการเผยแพร่และคาเร็ต ( ^) ช่วยให้คุณสามารถใช้งานฟังก์ชั่นใหม่ได้

ปัญหาคือรุ่นเก่ามักจะไม่ได้รับการแก้ไขข้อผิดพลาดที่มากใช้ NPM เพื่อ Caret ( ^) --saveเป็นค่าเริ่มต้นสำหรับ

ตาราง semver

ตามที่: "Semver อธิบาย - เหตุใดจึงมีเครื่องหมายรูปหมวก (^) ใน package.json ของฉัน" .

โปรดทราบว่ากฎนี้ใช้กับเวอร์ชันที่สูงกว่า 1.0.0 และไม่ใช่ทุกโครงการที่ตามมาด้วยการกำหนดเวอร์ชันแบบ semantic สำหรับรุ่น 0.xx ลูกศรช่วยให้เพียงแก้ไขปรับปรุงคือมันจะทำงานเช่นเดียวกับตัวหนอน ดูที่"Caret Ranges"

นี่คือคำอธิบายภาพของแนวคิด:

แผนภาพ semver

ที่มา: "ความหมายของรุ่น Cheatsheet"


2
^ 0.2.5 เกี่ยวกับอะไร จากdocs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : ช่วงแคเร็ต ^ 1.2.3 ^ 0.2.5 ^ 0.0.4 อนุญาตการเปลี่ยนแปลงที่ไม่แก้ไขตัวเลขซ้ายสุดที่ไม่ใช่ศูนย์ใน tuple [Major, minor, patch] กล่าวอีกนัยหนึ่งนี่เป็นการอนุญาตให้มีการอัปเดตแพตช์และรองสำหรับเวอร์ชัน 1.0.0 และสูงกว่าอัปเดตแพตช์สำหรับเวอร์ชั่น 0.X> = 0.1.0 และไม่มีการอัปเดตสำหรับรุ่น 0.0.X
rofrol

11
@rofrol เวอร์ชันใด ๆ ก่อน 1.0.0 ถือว่าไม่เสถียรและกฎเหล่านี้ใช้ไม่ได้
pspi

2
ดังนั้นคำอธิบายของคุณจึงไม่สมบูรณ์
rofrol

5
@rofrol ใช่การละเว้นการอ่านเป็นสิ่งที่ดีบางครั้งโอกาสที่จะมีอะไรต่ำกว่า 1.0.0 สำหรับการพึ่งพาในแพคเกจ json ค่อนข้างต่ำ ดูหลักการ 20/80 ยังเป็นกฎที่ดีสำหรับการมุ่งเน้นไปที่สิ่งที่สำคัญ
pspi

1
@pspi การมีรุ่นต่ำกว่า 1.0.0 เป็นไปได้หรือไม่ จาก 60 เรามี ~ 15 และส่วนใหญ่ไม่ชัดเจน
Dave Newton

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • ใช้เครื่องคิดเลข npm semverสำหรับการทดสอบ (แม้ว่าคำอธิบายสำหรับ ^ (รวมทุกอย่างที่มากกว่ารุ่นใดรุ่นหนึ่งในช่วงหลักเดียวกัน) และ ~ (รวมทุกอย่างที่มากกว่ารุ่นใดรุ่นหนึ่งในช่วงย่อยเดียวกัน) ไม่ถูกต้อง 100% เครื่องคิดเลขดูเหมือนว่าจะทำงานได้ดี )
  • หรือใช้การตรวจสอบ SemVerแทนซึ่งคุณไม่จำเป็นต้องเลือกแพ็คเกจและยังมีคำอธิบาย

อนุญาตหรือไม่อนุญาตการเปลี่ยนแปลง

  • รุ่นพิน: 1.2.3.
  • ใช้^(เช่นหัว) ช่วยให้การปรับปรุงที่ไม่ใช่ศูนย์ระดับที่สองจากซ้าย: หมายถึง^0.2.30.2.3 <= v < 0.3
  • ใช้~(เช่นหาง) โดยทั่วไปตรึงระดับขวาสุดหรือตั้งค่าเป็นศูนย์หากละเว้น:
    • ~1 วิธี 1.0.0 <= v < 2.0.0
    • ~1.21.2.0 <= v < 1.3.0วิธี
    • ~1.2.41.2.4 <= v < 1.3.0วิธี
  • Ommit ระดับที่เหมาะสมมากที่สุด: หมายถึง0.2 0.2 <= v < 1แตกต่างจาก~เพราะ:
    • การเริ่มต้นเวอร์ชันระดับที่ข้ามไปอยู่เสมอ 0
    • คุณสามารถตั้งค่าเวอร์ชันเริ่มต้นที่สำคัญได้โดยไม่ต้องระบุระดับย่อย

ความเป็นไปได้ทั้งหมด (หวังว่า)

ตั้งค่าระดับเริ่มต้นที่สำคัญและอนุญาตให้อัปเดตขึ้นไป

*  or "(empty string)   any version
1                         v >= 1

ตรึงระดับหลัก

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

ตรึงระดับผู้เยาว์

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

ตรึงระดับแพทช์

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

ไม่อนุญาตการอัปเดต

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

แจ้งให้ทราบล่วงหน้า : หายไปที่สำคัญผู้เยาว์แพทช์หรือการระบุbetaโดยไม่มีหมายเลขเป็นเช่นเดียวanyกับระดับที่ขาดหายไป

หมายเหตุ : เมื่อคุณติดตั้งแพ็คเกจที่มี0ระดับความสำคัญการอัปเดตจะติดตั้งเฉพาะรุ่นระดับเบต้า / pr ใหม่เท่านั้น! นั่นเป็นเพราะการnpmตั้งค่า^เป็นค่าเริ่มต้นในpackage.jsonและเมื่อเป็นรุ่นที่ติดตั้ง0.1.3มันค้างระดับหลัก / รอง / แพทช์ทั้งหมด


การบอกผู้คนให้หลีกเลี่ยงการเริ่มต้นโครงการจาก 0 เพราะห้องสมุดและผู้พัฒนาที่ไม่เข้าใจระบบเป็นทางออกที่น่ากลัว ฉันคิดว่า @ asdfasdfads มีข้อมูลที่ดีกว่ามาก
ProLoser

@ProLoser ฉันแค่คิดว่าระบบควรจะง่ายขึ้นและเราไม่ควรใช้รุ่น 0.x
rofrol

1
กรณีการใช้งานเกี่ยวกับการพัฒนาวงจรชีวิตก่อนกำหนดและ v0 เหมาะสมเป็นอย่างยิ่ง การเรียนรู้ว่า v0 ทำงานอย่างถูกต้องทำให้ฉันตั้งตารอโครงการอื่น ๆ ในช่วงแรก ๆ หมายความว่าคุณสามารถมี API ที่เปลี่ยนแปลงอย่างรวดเร็วโดยมีความเข้ากันได้แบบย้อนหลังจำนวนมากโดยไม่ถูกบังคับให้ประกาศโครงการของคุณเป็น 1.x (aka: เสถียร) เมื่อมันไม่จริง
ProLoser

ฉันเข้าใจ แต่ฉันไม่ชอบวิธีการทำงานกับ semver และ qualifier
rofrol

2
มันให้ความรู้สึกเหมือนเป็นความคิดเห็นมากกว่าและไม่ควรกำหนดกรอบเป็นวิธีการที่ยอมรับโดยทั่วไป และ ^ 0.1.x ได้รับการแก้ไขอย่างสมบูรณ์แบบ
ProLoser

93

~แก้ไขหมายเลขหลักและรอง มันถูกใช้เมื่อคุณพร้อมที่จะยอมรับการแก้ไขข้อบกพร่องในการพึ่งพาของคุณ แต่ไม่ต้องการการเปลี่ยนแปลงที่อาจเข้ากันไม่ได้

^แก้ไขหมายเลขหลักเท่านั้น มันถูกใช้เมื่อคุณเฝ้าดูการอ้างอิงของคุณอย่างใกล้ชิดและพร้อมที่จะเปลี่ยนรหัสของคุณอย่างรวดเร็วหากการปล่อยเล็กน้อยจะเข้ากันไม่ได้

นอกจากนั้น^ยังไม่รองรับโดยรุ่น NPM เก่าและควรใช้ด้วยความระมัดระวัง

ดังนั้น^เป็นค่าเริ่มต้นที่ดี แต่ไม่สมบูรณ์ ฉันแนะนำให้เลือกอย่างระมัดระวังและกำหนดค่าตัวดำเนินการ semver ที่เป็นประโยชน์กับคุณมากที่สุด


13
ไม่จริง: ช่วงคาเร็ต ^ 1.2.3 ^ 0.2.5 ^ 0.0.4 อนุญาตการเปลี่ยนแปลงที่ไม่แก้ไขตัวเลขซ้ายสุดที่ไม่ใช่ศูนย์ใน tuple [Major, minor, patch] กล่าวอีกนัยหนึ่งนี่เป็นการอนุญาตให้มีการอัปเดตแพตช์และรองสำหรับเวอร์ชัน 1.0.0 และสูงกว่าอัปเดตแพตช์สำหรับเวอร์ชั่น 0.X> = 0.1.0 และไม่มีการอัปเดตสำหรับรุ่น 0.0.X docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

6
คำตอบนี้ผิดทั้งหมด (เช่นที่อื่น ๆ ) สิ่งเหล่านี้ไม่เคยแก้ไขหมายเลขที่สำคัญ! ดังที่ @rofrol กล่าวว่า ^ เพียงแค่ทำให้ตัวเลขที่ไม่ใช่ศูนย์เหลืออยู่โดยไม่เปลี่ยนแปลง ~ ในอีกทางหนึ่งอนุญาตให้อัปเดตแพตช์หากมีการระบุรุ่นรอง (เช่น ~ 1.2.3 หรือ ~ 1.2) และอนุญาตการอัปเดตเล็กน้อยหากไม่ได้ระบุรุ่นรอง (เช่น ~ 1)
TheBaj

2
@TheBaj พวกเขาหมายถึง "แก้ไข" เป็น "define" ("fixate") มากกว่า "ปรับ" ดังนั้นคุณจึงเห็นด้วยกับวิธีการจัดการหมายเลขหลัก
maaartinus

1
ใช่คำตอบนี้ดูย้อนหลังโดยสิ้นเชิงจนกระทั่งฉันตระหนักว่าผู้ตอบตอบหมายถึง "แก้ไข" เช่นเดียวกับ "เพื่อให้คงที่อยู่กับที่หรือไม่เปลี่ยนแปลง"
NattyC

57

~: สมเหตุสมผลใกล้จะ

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: เข้ากันได้กับ

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

17
@kytwb - ไม่ ในกรณีพิเศษของหมายเลขเวอร์ชันของ zeroth-release กะรัตจะเทียบเท่ากับเครื่องหมายตัวหนอน ดังนั้น^0.1.3ยอมรับเฉพาะรุ่น0.1.xและจะไม่ยอมรับ0.2.0แม้ว่าจะเป็นการเพิ่มเล็กน้อย ~0.1.3พฤติกรรมนี้จะเทียบเท่ากับ เหตุผลที่อยู่เบื้องหลังพฤติกรรมนี้เกิดจากความจริงที่ว่าแพคเกจรุ่นซีโร่ยังคงไม่เสถียร ในคำพูดของsemver.org , # 4, "สิ่งใดอาจเปลี่ยนแปลงได้ตลอดเวลา" (รวมถึงการเปลี่ยนแปลงที่เข้ากันไม่ได้ย้อนหลัง)
chharvey

31

^ คือ 1. [ใด ๆ ] [ใด ๆ ] (รุ่นรองล่าสุด)
~คือ 1.2 [ใด ๆ ] (แพทช์ล่าสุด)

การอ่านที่ดีคือการโพสต์บล็อกเกี่ยวกับวิธีใช้ semver กับ npm
และสิ่งที่พวกเขากำลังทำเพื่อให้ตรงกับมาตรฐาน semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0


2
ไม่จริง: ช่วงคาเร็ต ^ 1.2.3 ^ 0.2.5 ^ 0.0.4 อนุญาตการเปลี่ยนแปลงที่ไม่แก้ไขตัวเลขซ้ายสุดที่ไม่ใช่ศูนย์ใน tuple [Major, minor, patch] กล่าวอีกนัยหนึ่งนี่เป็นการอนุญาตให้มีการอัปเดตแพตช์และรองสำหรับเวอร์ชัน 1.0.0 และสูงกว่าอัปเดตแพตช์สำหรับเวอร์ชั่น 0.X> = 0.1.0 และไม่มีการอัปเดตสำหรับรุ่น 0.0.X docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

28

หมวกจับคู่อาจจะถือว่า "เสีย" เพราะเคยชินอัปเดตการ^0.1.2 0.2.0เมื่อซอฟต์แวร์เกิดขึ้นให้ใช้0.x.yเวอร์ชันและการจับคู่หมวกจะตรงกับตัวเลขที่เปลี่ยนแปลงล่าสุดเท่านั้น ( y) นี้จะทำตามวัตถุประสงค์ เหตุผลคือในขณะที่ซอฟต์แวร์กำลังพัฒนา API เปลี่ยนแปลงอย่างรวดเร็ว: วันหนึ่งคุณมีวิธีการเหล่านี้และวันอื่น ๆ ที่คุณมีวิธีการเหล่านั้นและสิ่งเก่าหายไป หากคุณไม่ต้องการที่จะทำลายรหัสสำหรับคนที่กำลังใช้ห้องสมุดของคุณคุณจะไปและเพิ่มรุ่นใหญ่: เช่น1.0.0-> ->2.0.0 3.0.0ดังนั้นเมื่อถึงเวลาที่ซอฟต์แวร์ของคุณจะเสร็จสมบูรณ์ 100% และมีคุณสมบัติครบถ้วนมันจะเหมือนกับเวอร์ชั่น11.0.0และนั่นก็ดูไม่ค่อยมีความหมายและดูสับสนจริงๆ หากคุณใช้0.1.x->0.2.x-> 0.3.xเวอร์ชั่นจากนั้นตามเวลาที่ซอฟต์แวร์ทำเสร็จ 100% และมีฟีเจอร์เต็มรูปแบบออกเป็นเวอร์ชั่น1.0.0และหมายความว่า "รุ่นนี้เป็นบริการระยะยาวคุณสามารถดำเนินการต่อและใช้ไลบรารีเวอร์ชันนี้ในการผลิตของคุณได้ รหัสและผู้เขียนจะไม่เปลี่ยนแปลงทุกอย่างในวันพรุ่งนี้หรือเดือนหน้าและเขาจะไม่ละทิ้งแพ็คเกจ "

กฎคือ: ใช้การ0.x.yกำหนดเวอร์ชันเมื่อซอฟต์แวร์ของคุณยังไม่สุกและปล่อยมันด้วยการเพิ่มตัวเลขกลางเมื่อการเปลี่ยนแปลง API สาธารณะของคุณ (ดังนั้นคนที่^0.1.0ไม่ได้รับการ0.2.0ปรับปรุงและมันจะไม่ทำลายรหัสของพวกเขา) จากนั้นเมื่อซอฟต์แวร์ครบกำหนดให้ปล่อยภายใต้1.0.0และเพิ่มจำนวนหลักซ้ายสุดในแต่ละครั้งที่การเปลี่ยนแปลง API สาธารณะของคุณ (ดังนั้นผู้ที่^1.0.0ไม่ได้รับการ2.0.0อัพเดตและจะไม่ทำลายรหัสของพวกเขา)

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.

ความคิดเห็นนี้มีประโยชน์น่าขันและดูเหมือนว่าจะไม่ได้รับการบันทึกไว้เป็นอย่างดี คุณมีลิงค์ไปยังเอกสารเกี่ยวกับพฤติกรรมนี้หรือไม่? คำตอบเกี่ยวกับโครงการ v0 นี้ช่วยฉันได้มาก
ProLoser

ฉันไม่มีลิงค์: ฉันพบข้อมูลนี้ด้วย googling และเล่นกับเครื่องคิดเลขรุ่น npm semantic semy.npmjs.com
catamphetamine

2
จำเป็นต้องเพิ่มเอกสารของพวกเขาในวิธีที่เป็นทางการมากขึ้น ฉันได้พูดคุยกับ Sony กับทีมวิศวกรรมของฉันเพราะดูเหมือนจะถูกมองข้ามอย่างง่ายดาย slides.com/proloser/semver-v0
ProLoser

24

~ Tilde:

  • ~ค้างจำนวนหลักและรายย่อย
  • มันถูกใช้เมื่อคุณพร้อมที่จะยอมรับการแก้ไขข้อบกพร่องในการพึ่งพาของคุณ แต่ไม่ต้องการการเปลี่ยนแปลงที่อาจเข้ากันไม่ได้
  • เครื่องหมายตัวหนอนตรงกับรุ่นย่อยล่าสุด (หมายเลขกลาง)
  • ~ 1.2.3 จะตรงกับเวอร์ชัน 1.2.x ทั้งหมด แต่จะพลาด 1.3.0
  • Tilde (~) ให้การแก้ไขข้อบกพร่องแก่คุณ

^ Caret:

  • ^ ค้างจำนวนหลักเท่านั้น
  • มันถูกใช้เมื่อคุณเฝ้าดูการอ้างอิงของคุณอย่างใกล้ชิดและพร้อมที่จะเปลี่ยนรหัสของคุณอย่างรวดเร็วหากการปล่อยเล็กน้อยจะเข้ากันไม่ได้
  • มันจะอัปเดตคุณเป็นเวอร์ชันหลักล่าสุด (หมายเลขแรก)
  • ^ 1.2.3 จะตรงกับรุ่น 1.xx ใด ๆ ซึ่งรวมถึง 1.3.0 แต่จะหยุดลงที่ 2.0.0
  • Caret (^) ให้ฟังก์ชั่นใหม่ที่เข้ากันได้กับคุณเช่นกัน

1
เครื่องหมายตัวหนอนจะตรงกับเวอร์ชั่นล่าสุด (หมายเลขสุดท้าย) เครื่องหมายรูปหมวกตรงกับรุ่นรองล่าสุดที่สุด (หมายเลขกลาง)
Abdul Rauf

"ค้าง" เป็นคำอธิบายที่ดีที่สุด
mhrabiee

คาเร็ตทั้งคู่ค้างหมายเลขหลักและจะอัปเดตคุณเป็นเวอร์ชันหลักล่าสุด (หมายเลขแรก) หรือไม่ หมายเลขหลักคือหมายเลขแรกดังนั้นจึงไม่สมเหตุสมผล
NattyC

19

Tilde ~ตรงกับรุ่นรองหากคุณติดตั้งแพคเกจที่มี 1.4.2 และหลังการติดตั้งของคุณแล้วเวอร์ชัน 1.4.3 และ 1.4.4 ก็มีให้ใช้เช่นกันหากใน package.json ของคุณจะใช้เป็น ~ 1.4.2 และติดตั้ง npm ในโครงการของคุณหลังจากอัพเกรดจะติดตั้ง 1.4.4 ในโครงการของคุณ แต่มี 1.5.0 สำหรับแพ็คเกจนั้นมันจะไม่ถูกติดตั้งโดย ~ มันเรียกว่ารุ่นรอง

Caret ^ตรงกับรุ่นหลักหากมีการติดตั้งแพคเกจ 1.4.2 ในโครงการของคุณและหลังจากการติดตั้ง 1.5.0 ของคุณจะถูกนำออกใช้แล้ว ^ จะติดตั้งเวอร์ชันหลัก มันจะไม่อนุญาตให้มีการติดตั้ง 2.1.0 ถ้าคุณมี^ 1.4.2

เวอร์ชันที่แก้ไขหากคุณไม่ต้องการเปลี่ยนเวอร์ชั่นของแพ็คเกจในการติดตั้งแต่ละครั้งจากนั้นใช้เวอร์ชันที่แก้ไขโดยไม่ใช้อักขระพิเศษใด ๆ เช่น"1.4.2"

รุ่นล่าสุด *ถ้าคุณต้องการติดตั้งเวอร์ชั่นล่าสุดให้ใช้ * ด้านหน้าชื่อแพ็คเกจเท่านั้น


3
คำตอบนี้ทำให้เข้าใจผิด SemVer ระบุอย่างชัดเจนว่าหมายเลขเวอร์ชันปกติต้องอยู่ในรูปแบบ XYZ [โดยที่] X เป็นเวอร์ชันหลัก Y เป็นเวอร์ชันรองและ Z เป็นเวอร์ชันแก้ไข
Leo

15

คำอธิบายหนึ่งซับ

ระบบการกำหนดเวอร์ชันมาตรฐานคือ major.minor.build (เช่น 2.4.1)

npm ตรวจสอบและแก้ไขเวอร์ชันของแพ็กเกจเฉพาะตามอักขระเหล่านี้

~ : รุ่นหลักได้รับการแก้ไข, รุ่นรองได้รับการแก้ไข, ตรงกับหมายเลขบิลด์ใด ๆ

เช่น: ~ 2.4.1 หมายถึงมันจะตรวจสอบ 2.4.x โดยที่ x คืออะไร

^ : รุ่นหลักได้รับการแก้ไขตรงกับรุ่นรองใด ๆ ตรงกับหมายเลขบิลด์ใด ๆ

เช่น: ^ 2.4.1 หมายถึงมันจะตรวจสอบ 2.xx โดยที่ x คืออะไร


5
ฉันเห็น 7 บรรทัดในคำตอบนี้
FluxLemur

11

คุณอาจเห็นเครื่องหมายตัวหนอน (~) และคาเร็ต (^) ใน package.json ความแตกต่างระหว่างพวกเขาคืออะไร?

เมื่อคุณทำการติดตั้ง npm - บันทึกมันจะบันทึกรายการใน package.json ด้วยคำนำหน้า caret (^)

ตัวหนอน (~)

ในเงื่อนไขที่ง่ายที่สุด tilde (~) จะตรงกับเวอร์ชันย่อยล่าสุด (หมายเลขกลาง) ~ 1.2.3 จะตรงกับรุ่น 1.2.x ทั้งหมด แต่จะพลาด 1.3.0

คาเร็ต (^)

คาเร็ต (^) ในทางกลับกันจะผ่อนคลายมากขึ้น มันจะอัปเดตคุณเป็นเวอร์ชันหลักล่าสุด (หมายเลขแรก) ^ 1.2.3 จะตรงกับรุ่น 1.xx ใด ๆ รวมถึง 1.3.0 แต่จะระงับใน 2.0.0

การอ้างอิง: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b


อีกครั้งคำตอบนี้ทำให้เข้าใจผิด SemVer ระบุอย่างชัดเจนว่าหมายเลขเวอร์ชันปกติต้องอยู่ในรูปแบบ XYZ [โดยที่] X เป็นเวอร์ชันหลัก Y เป็นเวอร์ชันรองและ Z เป็นเวอร์ชันแก้ไข
Leo

5

semver แยกออกเป็น 3 ส่วนหลัก ๆ ซึ่งถูกแบ่งตามจุด

major.minor.patch
1.0.0

เมเจอร์รองลงมาและแพทช์ต่าง ๆ เหล่านี้ใช้เพื่อระบุรีลีสที่แตกต่างกัน ไทด์ (~) และคาเร็ต (^) กำลังใช้เพื่อระบุเวอร์ชันรองและแพทช์ที่จะใช้ในการกำหนดเวอร์ชันของแพ็กเกจ

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

Tilde (~)

รุ่นหลักได้รับการแก้ไขรุ่นรองได้รับการแก้ไขตรงกับหมายเลขบิลด์ใด ๆ

"express": "~4.13.3" 

~4.13.3 หมายความว่ามันจะตรวจสอบ 4.13.x โดยที่ x คืออะไรและ 4.14.0

คาเรต (^)

รุ่นหลักได้รับการแก้ไขตรงกับรุ่นรองใด ๆ ตรงกับหมายเลขรุ่นใด ๆ

"supertest": "^3.0.0"

^3.0.0 หมายความว่ามันจะตรวจสอบ 3.xx โดยที่ x คืออะไร


คุณช่วยอธิบายได้ไหมว่าคำตอบนี้แตกต่างจากคำตอบเดิมที่โพสต์เมื่อ 4 ปีที่แล้วหรือไม่?
แฟรงคลินหยู

2

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

major.minor.patch 1.0.2

Major, minor และ patch เป็นตัวแทนของแพ็คเกจต่าง ๆ

npm ใช้ tilde (~) และ caret (^) เพื่อกำหนดแพทช์และเวอร์ชันรองที่จะใช้ตามลำดับ

ดังนั้นหากคุณเห็น ~ 1.0.2 หมายถึงการติดตั้งเวอร์ชัน 1.0.2 หรือเวอร์ชันแก้ไขล่าสุดเช่น 1.0.4 ถ้าคุณเห็น ^ 1.0.2 หมายถึงการติดตั้งเวอร์ชัน 1.0.2 หรือรุ่นรองล่าสุดหรือแพตช์ล่าสุดเช่น 1.1.0


1
คุณช่วยอธิบายได้ไหมว่าคำตอบนี้แตกต่างจากคำตอบเดิมที่โพสต์เมื่อ 4 ปีที่แล้วหรือไม่?
แฟรงคลินหยู

2

กะรัต ^รวมทุกอย่างที่มากกว่ารุ่นเฉพาะในช่วงหลักเดียวกัน

tilde ~รวมทุกอย่างที่มากกว่ารุ่นเฉพาะในช่วงย่อยเดียวกัน

ตัวอย่างเช่นเมื่อต้องการระบุเวอร์ชันที่ยอมรับได้สูงสุดถึง 1.0.4 ให้ใช้ไวยากรณ์ต่อไปนี้:

  • โปรแกรมปรับปรุงรุ่น: 1.0 หรือ 1.0.x หรือ ~ 1.0.4
  • รุ่นย่อย: 1 หรือ 1.x หรือ ^ 1.0.4
  • รุ่นใหญ่: * หรือ x

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์เวอร์ชันความหมายดูNPM semver เครื่องคิดเลข

รุ่นความหมาย npm ในแพ็คเกจที่เผยแพร่

เพิ่มเติมจากเอกสาร npm เกี่ยวกับการกำหนดเวอร์ชันความหมาย


1

ไม่ใช่คำตอบต่อ แต่เป็นข้อสังเกตที่ดูเหมือนจะถูกมองข้าม

คำอธิบายสำหรับช่วงกะรัต:

ดู: https://github.com/npm/node-semver#caret-ranges-123-025-004

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

หมายถึงการ^10.2.3แข่งขันที่10.2.3 <= v < 20.0.0

ฉันไม่คิดว่านั่นคือสิ่งที่พวกเขาหมายถึง การดึงเวอร์ชั่น 11.xx ถึง 19.xx จะทำให้รหัสของคุณพัง

left most non-zero number fieldผมคิดว่าพวกเขาหมายถึง ไม่มีอะไรใน SemVer ที่ต้องการให้ฟิลด์ตัวเลขเป็นตัวเลขหลักเดียว


0

~ specfices ไปยังรุ่นย่อย ^ ระบุรุ่นที่สำคัญ

ตัวอย่างเช่นหากแพ็คเกจเวอร์ชัน 4.5.2 บนอัปเดต ~ 4.5.2 จะติดตั้งเวอร์ชันล่าสุด 4.5.x (รุ่นรอง) ^ 4.5.2 จะติดตั้งเวอร์ชัน 4.xx ล่าสุด (รุ่นหลัก)


8
คุณช่วยอธิบายได้ไหมว่าคำตอบนี้แตกต่างจากคำตอบเดิมที่โพสต์เมื่อ 4 ปีที่แล้วหรือไม่?
แฟรงคลินหยู

0

เกี่ยวข้องกับคำถามนี้คุณสามารถตรวจสอบเอกสารนักแต่งเพลงเกี่ยวกับเวอร์ชันได้ แต่ย่อมาจาก:

  • Tilde Version Range ( ~ ) - ~ 1.2.3 เทียบเท่ากับ> = 1.2.3 < 1.3.0
  • Caret Version Range ( ^ ) - ~ 1.2.3 เทียบเท่ากับ> = 1.2.3 < 2.0.0

ดังนั้นด้วยTildeคุณจะได้รับการอัปเดตอัตโนมัติของโปรแกรมแก้ไข แต่รุ่นรองและรุ่นหลักจะไม่ได้รับการอัปเดต อย่างไรก็ตามถ้าคุณใช้Caretคุณจะได้รับ Patch และเวอร์ชันรอง แต่คุณจะไม่ได้รับเวอร์ชันที่สำคัญ

Tilde Version ถือว่าเป็นวิธีที่ปลอดภัยกว่า แต่ถ้าคุณใช้การพึ่งพาที่เชื่อถือได้ (ไลบรารีที่ได้รับการดูแลเป็นอย่างดี) คุณไม่ควรมีปัญหาใด ๆ กับ Caret Version (เนื่องจากการเปลี่ยนแปลงเล็กน้อยไม่ควรทำลายการเปลี่ยนแปลง

คุณอาจจะตรวจสอบการโพสต์ StackOverflow นี้เกี่ยวกับความแตกต่างระหว่างนักแต่งเพลงที่ติดตั้งและปรับปรุงการแต่งเพลง

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