node.js - Package.json में tilde(~) और caret(^) के बीच क्या अंतर है?




npm (10)

नवीनतम स्थिर node और npm अपग्रेड करने के बाद, मैंने npm install moment --save की कोशिश की। यह caret(^) उपसर्ग के साथ package.json में प्रविष्टि बचाता है। पहले, यह एक tilde(~) उपसर्ग था।

  1. npm में ये परिवर्तन क्यों किए गए हैं?
  2. tilde(~) और caret(^) बीच क्या अंतर है?
  3. दूसरों पर फायदे क्या हैं?

सबसे सरल शब्दों में, टिल्ड सबसे हालिया मामूली संस्करण (मध्य संख्या) से मेल खाता है। ~ 1.2.3 सभी 1.2.x संस्करणों से मेल खाएगा लेकिन 1.3.0 से चूक जाएगा।

दूसरी ओर, देखभाल अधिक आराम से है। यह आपको सबसे हालिया प्रमुख संस्करण (पहली संख्या) में अपडेट करेगा। ^ 1.2.3 1.3.0 सहित किसी भी 1.xx रिलीज से मेल खाएगा, लेकिन 2.0.0 पर बंद होगा।

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/

ध्यान दें कि लेखक की शब्दावली कुछ हद तक भ्रामक है: जब वह कहता है कि "सबसे हालिया मामूली संस्करण" के लिए उसका मतलब है "निर्दिष्ट मामूली संस्करण में सबसे हालिया पैच संस्करण"। इसी तरह ^ ^ "सबसे हालिया प्रमुख संस्करण" को "निर्दिष्ट प्रमुख संस्करण में सबसे हालिया मामूली संस्करण" के रूप में पढ़ा जाना चाहिए।


Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • परीक्षण के लिए semver.npmjs.com प्रयोग करें। (हालांकि ^ के लिए स्पष्टीकरण (एक ही प्रमुख श्रेणी में किसी विशेष संस्करण से अधिक सब कुछ शामिल है) और ~ (एक ही मामूली सीमा में किसी विशेष संस्करण से अधिक सब कुछ शामिल करें) 100% सही नहीं है, कैलकुलेटर ठीक काम करता प्रतीत होता है )
  • वैकल्पिक रूप से, इसके बजाय सेमवीर चेक का उपयोग करें , जिसके लिए आपको पैकेज चुनने की आवश्यकता नहीं है और स्पष्टीकरण भी प्रदान करता है।

परिवर्तनों को अनुमति दें या अनुमति दें

  • पिन संस्करण: 1.2.3
  • ^ (जैसे सिर) का प्रयोग करें। बाएं से दूसरे गैर-शून्य स्तर पर अपडेट की अनुमति देता है: ^0.2.3 अर्थ है 0.2.3 <= v < 0.3
  • ~ (पूंछ की तरह) का प्रयोग करें। आम तौर पर छोड़े जाने पर दाएं-अधिकतर स्तर को फ्रीज करें या शून्य सेट करें:
    • ~1 मतलब 1.0.0 <= v < 2.0.0
    • ~1.2 मतलब है 1.2.0 <= v < 1.3.0
    • ~1.2.4 मतलब है 1.2.4 <= v < 1.3.0
  • दाएं-सबसे अधिक स्तर को छोड़ दें: 0.2 अर्थ है 0.2 <= v < 1 । से डिफर्स ~ क्योंकि:
    • छोड़े गए स्तर संस्करण शुरू करना हमेशा 0
    • आप sublevels निर्दिष्ट किए बिना प्रमुख संस्करण शुरू कर सकते हैं।

सभी (उम्मीद है) संभावनाएं

प्रमुख स्तर शुरू करना और अद्यतन ऊपर की ओर सेट करें

*  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 निर्दिष्ट करना, लापता स्तर के लिए समान है।

नोटिस : जब आप एक पैकेज स्थापित करते हैं जिसमें 0 के स्तर के रूप में 0 है, तो अपडेट केवल नए बीटा / पीआर स्तर संस्करण स्थापित करेगा! ऐसा इसलिए है क्योंकि npm सेट ^ package.json में डिफ़ॉल्ट के रूप में और जब स्थापित संस्करण 0.1.3 की तरह है, तो यह सभी प्रमुख / मामूली / पैच स्तर को जमा करता है।


आपने शायद पैकेज.जेसन में टिल्ड (~) और कैरेट (^) देखा है। उनके बीच क्या अंतर है?

जब आप npm को पल इंस्टॉल करते हैं - बचाओ, यह caret (^) उपसर्ग के साथ package.json में प्रविष्टि सहेजता है।

टिल्ड (~)

सबसे सरल शब्दों में, tilde (~) सबसे हालिया मामूली संस्करण (मध्य संख्या) से मेल खाता है। ~ 1.2.3 सभी 1.2.x संस्करणों से मेल खाएगा लेकिन 1.3.0 से चूक जाएगा।

देखभाल (^)

दूसरी ओर, देखभाल (^), अधिक आराम से है। यह आपको सबसे हालिया प्रमुख संस्करण (पहली संख्या) में अपडेट करेगा। ^ 1.2.3 1.3.0 सहित किसी भी 1.xx रिलीज से मेल खाएगा, लेकिन 2.0.0 पर बंद होगा।

संदर्भ: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b


एनपीएम एक निर्दिष्ट पैकेज की तुलना में पैकेज के नए संस्करण को स्थापित करने की अनुमति देता है। टिल्डे ( ~ ) का उपयोग करके आपको बग फिक्स रिलीज और कैरेट ( ^ ) देता है जो आपको पिछली संगत नई कार्यक्षमता देता है।

समस्या पुराने संस्करणों को आमतौर पर बग फिक्स प्राप्त नहीं होता है, इसलिए एनपीएम कैरेट ( ^ ) का उपयोग --save लिए डिफ़ॉल्ट के रूप में --save

के अनुसार: "सेमेवर समझाया - मेरे पैकेज.जेसन में एक कैरेट (^) क्यों है?"

ध्यान दें कि नियम 1.0.0 से ऊपर के संस्करणों पर लागू होते हैं और प्रत्येक प्रोजेक्ट अर्थपूर्ण संस्करण का पालन नहीं करता है। संस्करण 0.xx के लिए कैरेट केवल पैच अपडेट की अनुमति देता है, यानी यह टिल्डे जैसा ही व्यवहार करता है। "कैरेट रेंज" देखें

अवधारणाओं का एक दृश्य स्पष्टीकरण यहां दिया गया है:

स्रोत: "अर्थपूर्ण संस्करणिंग चीटशीट"


संस्करण संख्या वाक्यविन्यास में है जो प्रत्येक खंड को अलग-अलग अर्थ के साथ निर्दिष्ट करती है। वाक्यविन्यास को एक बिंदु से अलग तीन खंडों में विभाजित किया जाता है।

major.minor.patch 1.0.2

प्रमुख, मामूली और पैच पैकेज के विभिन्न रिलीज का प्रतिनिधित्व करते हैं।

npm क्रमशः उपयोग करने के लिए कौन सा पैच और मामूली संस्करणों को निर्दिष्ट करने के लिए tilde (~) और caret (^) का उपयोग करता है।

तो यदि आप ~ 1.0.2 देखते हैं तो इसका अर्थ संस्करण 1.0.2 या नवीनतम पैच संस्करण जैसे 1.0.4 इंस्टॉल करना है। यदि आप ^ 1.0.2 देखते हैं तो इसका अर्थ संस्करण 1.0.2 या नवीनतम नाबालिग या पैच संस्करण जैसे 1.1.0 स्थापित करना है।


हैट मिलान को "टूटा" माना जा सकता है क्योंकि यह ^0.1.2 से 0.2.0 अपडेट नहीं 0.2.0 । जब सॉफ़्टवेयर उभर रहा है 0.xy संस्करण और टोपी मिलान केवल अंतिम भिन्न अंक ( y ) से मेल खाता है। यह उद्देश्य पर किया जाता है। इसका कारण यह है कि जब सॉफ्टवेयर एपीआई को तेजी से विकसित कर रहा है, तो एक दिन आपके पास ये विधियां हैं और दूसरे दिन आपके पास ये विधियां हैं और पुराने लोग चले गए हैं। यदि आप पहले से ही अपनी लाइब्रेरी का उपयोग कर रहे लोगों के लिए कोड तोड़ना नहीं चाहते हैं तो आप बड़े संस्करण को बढ़ाएं और बढ़ाएं: उदाहरण 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.xy संस्करण का उपयोग करें जब आपका सॉफ़्टवेयर अभी तक परिपक्व नहीं हुआ है और जब आपका सार्वजनिक एपीआई बदलता है तो मध्य अंक में वृद्धि के साथ इसे रिलीज़ किया जाता है (इसलिए ^0.1.0 वाले लोगों को 0.2.0 अपडेट नहीं मिलेगा और यह ' टी उनके कोड तोड़ने के लिए)। फिर, जब सॉफ़्टवेयर परिपक्व हो जाता है, तो इसे 1.0.0 तहत रिलीज़ करें और प्रत्येक बार जब आपका सार्वजनिक एपीआई बदलता है तो बाएंतम अंक बढ़ाएं (इसलिए जिन लोगों के पास ^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.

~ : उचित रूप से करीब

   ~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

~ प्रमुख और मामूली संख्या तय करता है। इसका उपयोग तब किया जाता है जब आप अपनी निर्भरता में बग-फ़िक्स स्वीकार करने के लिए तैयार होते हैं, लेकिन किसी संभावित रूप से असंगत परिवर्तन नहीं चाहते हैं।

^ केवल प्रमुख संख्या को ठीक करता है। इसका उपयोग तब किया जाता है जब आप अपनी निर्भरताओं को बारीकी से देख रहे हैं और मामूली रिलीज असंगत होने पर आपके कोड को तेज़ी से बदलने के लिए तैयार हैं।

इसके अलावा, ^ पुराने एनपीएम संस्करणों द्वारा समर्थित नहीं है , और सावधानी के साथ प्रयोग किया जाना चाहिए।

तो, ^ एक अच्छा डिफ़ॉल्ट है, लेकिन यह सही नहीं है। मैं सुझाव देता हूं कि सेमेवर ऑपरेटर को सावधानी से चुनें और कॉन्फ़िगर करें जो आपके लिए सबसे उपयोगी है।


एक लाइनर स्पष्टीकरण

मानक वर्जनिंग सिस्टम major.minor.build है (उदाहरण 2.4.1)

एनपीएम इन वर्णों के आधार पर किसी विशेष पैकेज के संस्करण को जांचता है और ठीक करता है

~ : प्रमुख संस्करण तय किया गया है, मामूली संस्करण तय किया गया है, किसी भी बिल्ड नंबर से मेल खाता है

उदाहरण: ~ 2.4.1 का मतलब है कि यह 2.4.x की जांच करेगा जहां एक्स कुछ भी है

^ : प्रमुख संस्करण तय किया गया है, किसी भी मामूली संस्करण से मेल खाता है, किसी भी बिल्ड नंबर से मेल खाता है

उदाहरण: ^ 2.4.1 का अर्थ है कि यह 2.xx की जांच करेगा जहां एक्स कुछ भी है


टिल्डे (~)

प्रमुख संस्करण तय किया गया है, मामूली संस्करण तय किया गया है, किसी भी बिल्ड नंबर से मेल खाता है

"express": "~4.13.3" 

~4.13.3 अर्थ है कि यह ~4.13.3 की जांच करेगा जहां एक्स कुछ भी है और 4.14.0 है

कैरेट (^)

प्रमुख संस्करण तय किया गया है, किसी भी मामूली संस्करण से मेल खाता है, किसी भी बिल्ड नंबर से मेल खाता है

"supertest": "^3.0.0"

^3.0.0 मतलब है कि यह 3.xx की जांच करेगा जहां एक्स कुछ भी है





npm