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


3379

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

  1. ये बदलाव क्यों किए गए हैं npm?
  2. टिल्ड ~और कैरट में क्या अंतर है ^?
  3. दूसरों पर क्या फायदे हैं?

42
FYI करें आप उपसर्गों को रोक सकते हैं या एक कस्टम का उपयोग करके कर सकते हैं npm config set save-prefix='':। ( ~उद्धरण चिह्नों में चिपकाएँ यदि आप इसे पसंद करते हैं।) मैं व्यक्तिगत रूप से ऐसा करता हूं और उत्पादन में चीजों के लिए सिकुड़ता हूं।
fncomp

19
: कैसे टिल्ड और कैरट काम करते हैं और सभी अंतरों के जुओं से भरा हुआ किरकिरा विवरण github.com/npm/node-semver#tilde-ranges-123-12-1
जेफरी मार्टिनेज

11
यह उपकरण semver.npmjs.com
chaiyachaiya

@fncomp केवल यह स्पष्ट करना चाहता था कि क्या मुझे आपकी टिप्पणी सही लगी है .. क्या आप अपनी परियोजना में निर्भरता के केवल विशिष्ट संस्करणों का उपयोग करते हैं? हमारी टीम निर्भरता के उन्नयन से हिचकिचा रही है .. क्या आप विशिष्ट संस्करणों या निर्भरता के लिए '~' उपसर्ग का उपयोग करने की सिफारिश करेंगे ..?
ब्लॉग

@fncomp क्या आप विस्तार से कह सकते हैं कि आपके कहने का अर्थ है "मैं व्यक्तिगत रूप से ऐसा करता हूं और उत्पादन में चीजों के लिए हटना"। धन्यवाद!
ब्लॉग

जवाबों:


3837

देखें NPM डॉक्स और semver डॉक्स

~ संस्करण "लगभग संस्करण के बराबर", मामूली संस्करण को बढ़ाए बिना, आपको सभी भविष्य के पैच संस्करणों में अपडेट करेगा। ~1.2.31.2.3 से <1.3.0 तक रिलीज का उपयोग करेगा।

^ संस्करण "संस्करण के साथ संगत", प्रमुख संस्करण को बढ़ाए बिना, आपको भविष्य के सभी छोटे / पैच संस्करणों के लिए अपडेट करेगा। ^2.3.42.3.4 से <3.0.0 तक रिलीज़ का उपयोग करेगा।

नीचे टिप्पणियाँ देखें।


323
उम्मीद है कि लोगों को पकड़ने के लिए यहां पोस्टिंग है जो इस माध्यम से नहीं सोचते हैं, लेकिन ^ और ~ दोनों मानते हैं कि आप अपनी निर्भरता से मामूली और बिंदु रिलीज पर भरोसा कर सकते हैं। यदि आप एक पुस्तकालय प्रकाशित कर रहे हैं और अन्य लोगों को आप पर भरोसा करना चाहते हैं, तो डाउनलोड करने के पहले मत डाउनलोड करें। आपकी निर्भरता से खराब डॉट रिलीज़ श्रृंखला की प्रतिक्रिया को ऊपर की ओर ले जा सकती है, और जब चीजें नाशपाती के आकार की होंगी तो आपके दरवाजे पर लोगों को दस्तक होगी। यह आपके उत्पादन कोड पर npm सिक्रेट्रैप का उपयोग करने का एक और बहुत बड़ा कारण है।
तेहफू

8
तुम भी बस npm के सभी बकवास के साथ दूर कर सकते हैं एक ^या एक के साथ अपने संस्करणों prepending ~। इसे सेट करें यदि आप अपने संस्करणों पर कड़ा नियंत्रण रखना चाहते हैं: npm config set save-prefix=''
कुमारहर्ष

5
@prasanthv सही है: 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। उन परिवर्तनों को अनुमति देता है जो [प्रमुख, मामूली, पैच] टपल में बाएं-सबसे गैर-शून्य अंक को संशोधित नहीं करते हैं। दूसरे शब्दों में, यह संस्करण 1.0.0 और इसके बाद के संस्करणों के लिए पैच और मामूली अपडेट की अनुमति देता है, संस्करणों के लिए पैच अपडेट 0.X> = 0.1.0, और संस्करण 0.0.X के लिए कोई अपडेट नहीं।
रफ्रोल

15
जब आप उपयोग करते हैं तो @jgillich 0.2.x, 2नहीं है major version। इसीलिए docs.npmjs.com ने विशिष्ट शब्दों का उपयोग किया the left-most non-zero digit:। इस मामले के बारे में भी क्या है: ^
0.0.4 का

11
@ FagnerBrack: आपके द्वारा प्रदान किया गया विशिष्ट उदाहरण सही है, लेकिन आम तौर पर आपके सोचने का तरीका गलत है। एक उदाहरण: लेट मान लीजिए कि आप पैकेज है A3 संस्करणों में: 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आपको इस समस्या से बचने में मदद करनी चाहिए।
मकिज एसजे

861

मैं आधिकारिक npmjs प्रलेखन को जोड़ना चाहूंगा, जो संस्करण विशिष्टता के लिए सभी तरीकों का वर्णन करता है, जिसमें प्रश्न में निर्दिष्ट किए गए हैं -

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

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

  • ~version"लगभग वर्जन के बराबर" एनपीएम सेवर देखें - टिल्ड रेंज और सेवर (7)
  • ^version"संस्करण के साथ संगत" एनपीएम सेवर देखें - कैरेट रेंज और सेवर (7)
  • version बिल्कुल संस्करण से मेल खाना चाहिए
  • >version संस्करण से अधिक होना चाहिए
  • >=version आदि
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, आदि, लेकिन 1.3.0 नहीं
  • http://sometarballurl (यह एक टारबॉल का URL हो सकता है जिसे स्थानीय रूप से डाउनलोड और इंस्टॉल किया जाएगा
  • * किसी भी संस्करण से मेल खाता है
  • latest नवीनतम रिलीज प्राप्त करता है

उपरोक्त सूची संपूर्ण नहीं है। अन्य वर्जन स्पेसिफिकर्स में GitHub urls और 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 और नीचे
कोडमैनएक्स

एक अधिक विशिष्ट लिंक ऊपर दिया गया है -> docs.npmjs.com/files/package.json#d dependencies
टोबी

"Approximately equivalent to version"और "Compatible with version"~ और ^ व्यवहार का वर्णन करने के लिए ऐसे निराशाजनक तरीके से गैर-विशिष्ट तरीके हैं। वास्तविक उत्तर प्रदान करने के लिए @jgillich को धन्यवाद!
स्कॉट स्टैफ़ोर्ड

635

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

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

सेमर टेबल

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

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

यहाँ अवधारणाओं का एक दृश्य विवरण है:

शब्दार्थ आरेख

स्रोत: "सिमेंटिक संस्करण छलपत्र"


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। उन परिवर्तनों को अनुमति देता है जो [प्रमुख, मामूली, पैच] टपल में बाएं-सबसे गैर-शून्य अंक को संशोधित नहीं करते हैं। दूसरे शब्दों में, यह संस्करण 1.0.0 और इसके बाद के संस्करणों के लिए पैच और मामूली अपडेट की अनुमति देता है, संस्करणों के लिए पैच अपडेट 0.X> = 0.1.0, और संस्करण 0.0.X के लिए कोई अपडेट नहीं।
रफ्रोल

11
@ 1.0.0 से पहले किसी भी संस्करण को अस्थिर माना जाता है और ये नियम लागू नहीं होते हैं
pspi

2
तो आपका स्पष्टीकरण पूर्ण नहीं है
rofrol

5
@rofrol हाँ, पठनीयता के लिए छोड़ना कभी-कभी अच्छा होता है, पैकेज जसन में निर्भरता के लिए 1.0.0 से नीचे कुछ भी होने की संभावना बहुत कम होती है। यह भी देखें 20/80 सिद्धांत, किन मामलों पर ध्यान केंद्रित करने के लिए एक महान नियम है
pspi

1
@pspi के नीचे वाले संस्करण 1.0.0 "असम्भव" हैं? 60 में से हमने ~ 15 प्राप्त किए हैं, और उनमें से अधिकांश अस्पष्ट नहीं हैं।
डेव न्यूटन

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • परीक्षण के लिए एनपीएम सेवर कैलकुलेटर का उपयोग करें । (हालांकि ^ के लिए स्पष्टीकरण (एक ही प्रमुख रेंज में एक विशेष संस्करण से अधिक सब कुछ शामिल है) और ~ (एक ही मामूली रेंज में एक विशेष संस्करण से अधिक सब कुछ शामिल करें) 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
    • आप उपशीर्षों को निर्दिष्ट किए बिना प्रमुख संस्करण शुरू कर सकते हैं।

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

प्रमुख स्तर की शुरुआत सेट करें और अपडेट को ऊपर की ओर जाने दें

*  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प्रमुख स्तर होता है, तो अपडेट केवल नया बीटा / पीआर स्तर संस्करण स्थापित करेगा! ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप में npmसेट और जब स्थापित संस्करण की तरह है , यह सभी प्रमुख / मामूली / पैच स्तरों को जमा देता है।^package.json0.1.3


लोगों से कहना कि प्रोजेक्ट्स को 0 से शुरू करने से बचें क्योंकि लाइब्रेरी और कंज्यूमर डवलपर्स को समझ में नहीं आता है कि सिस्टम एक भयानक उपाय है। मुझे लगता है कि @asdfasdfads के पास बेहतर जानकारी है।
प्रोलर सेप

@ProLoser मुझे लगता है कि सिस्टम को सरल बनाया जाना चाहिए, और हमें 0.x संस्करणों का उपयोग नहीं करना चाहिए।
रॉफ्रोल

1
प्रारंभिक जीवनचक्र विकास और v0 के आसपास का उपयोग मामला बहुत मायने रखता है। यह सीखना कि v0 कैसे ठीक से व्यवहार करता है वास्तव में मुझे अन्य प्रारंभिक जीवनचक्र परियोजनाओं के लिए तत्पर है। इसका मतलब है कि जब आप अपनी परियोजना को 1.x (उर्फ: स्थिर) के रूप में घोषित करने के लिए मजबूर नहीं होते हैं तो आप बहुत तेजी से बदलते एपीआई के साथ हो सकते हैं।
प्रोलसर

मैं इसे समझता हूं, लेकिन मुझे यह पसंद नहीं है कि यह
rofrol

2
यह एक राय की तरह लगता है और आम तौर पर स्वीकृत दृष्टिकोण के रूप में तैयार नहीं किया जाना चाहिए। और ^ 0.1.x पूरी तरह से ठीक हो जाता है।
प्रोलोज़र

93

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

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

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

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


13
सच नहीं: कैरेट रेंज ^ 1.2.3 ^ 0.2.5 ^ 0.0.4। उन परिवर्तनों को अनुमति देता है जो [प्रमुख, मामूली, पैच] टपल में बाएं-सबसे गैर-शून्य अंक को संशोधित नहीं करते हैं। दूसरे शब्दों में, यह संस्करण 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)।
बज

2
@ TheBaj का अर्थ है "फ़िक्स" को "एडजस्ट" ("फ़िक्स") के बजाय "एडजस्ट" करें, इसलिए आप सभी इस बात पर सहमत हैं कि बड़ी संख्या कैसे होती है।
माआर्टिनस

1
हां, यह उत्तर तब तक पूरी तरह से पीछे लग रहा था, जब तक कि मुझे यह महसूस नहीं हो गया कि उत्तर देने वाले का अर्थ "फिक्स" है, जैसे "स्थिर, स्थिर या अपरिवर्तनीय बनाना।"
नैटसी

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 - नहीं। शून्य-रिलीज़ संस्करण संख्याओं के विशेष मामले में, कैरेट टिल्ड के बराबर है। इस प्रकार ^0.1.3केवल संस्करण 0.1.xस्वीकार करते हैं और स्वीकार नहीं करेंगे 0.2.0, भले ही यह मामूली वृद्धि हो। यह व्यवहार के बराबर है ~0.1.3। इस व्यवहार के पीछे तर्क इस तथ्य के कारण है कि शून्य-रिलीज़ पैकेज अभी भी अस्थिर माना जाता है; semver.org , # 4 के शब्दों में , "किसी भी समय कुछ भी बदल सकता है" (बैकवर्ड-असंगत परिवर्तन सहित)।
छुरी

31

^है 1. [कोई] [कोई भी] (नवीनतम लघु संस्करण)
~1.2 है। [कोई भी] (नवीनतम पैच)

एक बेहतरीन रीड यह ब्लॉग पोस्ट है कि कैसे सेमी एनपीएम पर लागू होता है
और वे इसे बनाने के लिए क्या कर रहे हैं यह सेवर मानक से मेल खाता है
http://blog.npmjs.org/post/98131109725/npm-2-0-0


2
सच नहीं: कैरेट रेंज ^ 1.2.3 ^ 0.2.5 ^ 0.0.4। उन परिवर्तनों को अनुमति देता है जो [प्रमुख, मामूली, पैच] टपल में बाएं-सबसे गैर-शून्य अंक को संशोधित नहीं करते हैं। दूसरे शब्दों में, यह संस्करण 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) से मेल खाएगा । यह उद्देश्य पर किया जाता है। कारण यह है कि जब सॉफ्टवेयर विकसित हो रहा है एपीआई तेजी से बदलता है: एक दिन आपके पास ये तरीके होते हैं और दूसरे दिन आपके पास वे तरीके होते हैं और पुराने खत्म हो जाते हैं। यदि आप उन लोगों के लिए कोड नहीं तोड़ना चाहते हैं जो पहले से ही आपके पुस्तकालय का उपयोग कर रहे हैं तो आप जाएं और प्रमुख संस्करण बढ़ाएँ: उदा 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जब आपके सॉफ्टवेयर अभी तक परिपक्व नहीं हुए हैं तो वर्जनिंग का उपयोग करें और इसे बीच के अंक में वृद्धि के साथ जारी करें जब आपका सार्वजनिक एपीआई बदलता है (इसलिए लोगों को अपडेट ^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.

यह टिप्पणी हास्यास्पद रूप से सहायक थी और यह बहुत अच्छी तरह से प्रलेखित नहीं लगती है। क्या आपके पास इस व्यवहार के आसपास के दस्तावेज़ का लिंक है? V0 प्रोजेक्ट्स के बारे में इस जवाब ने मुझे बहुत मदद की है।
प्रोलोजर

मेरे पास लिंक नहीं है: मुझे यह जानकारी गुग्लिंग और npm
catamphetamine

2
और अधिक औपचारिक तरीके से उनके प्रलेखन में जोड़े जाने की आवश्यकता है। मैंने अपनी इंजीनियरिंग टीम को सोनी पर एक बात दी क्योंकि ऐसा लगता है कि यह आसानी से अनदेखा हो गया है। स्लाइड्स http://www.proloser/semver-v0
प्रोलोसर

24

~ टिल्डे:

  • ~प्रमुख और मामूली संख्या जमा करता है
  • इसका उपयोग तब किया जाता है जब आप अपनी निर्भरता में बग-फिक्सेस को स्वीकार करने के लिए तैयार होते हैं, लेकिन कोई संभावित असंगत परिवर्तन नहीं चाहते हैं।
  • टिल्ड सबसे हालिया लघु संस्करण (मध्य संख्या) से मेल खाता है ।
  • ~ 1.2.3 सभी 1.2.x संस्करणों से मेल खाएगा, लेकिन यह 1.3.0 से छूट जाएगा।
  • टिल्डे (~) आपको बग फिक्स रिलीज देता है

^ कैरेट:

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

1
टिल्ड सबसे हालिया पैच संस्करण (अंतिम संख्या) से मेल खाता है। कैरेट सबसे हाल के मामूली संस्करण (मध्य संख्या) से मेल खाता है।
अब्दुल रऊफ

"फ्रीज" सबसे अच्छा स्पष्टीकरण है।
mhrabiee

कैरेट दोनों प्रमुख संख्या को जमा देता है और आपको सबसे हाल के प्रमुख संस्करण (पहली संख्या) में अपडेट करेगा? प्रमुख संख्या पहला नंबर है, इसलिए इसका कोई मतलब नहीं है।
23

19

टिल्ड ~ मामूली संस्करण से मेल खाता है, यदि आपने एक पैकेज स्थापित किया है जिसमें 1.4.2 है और आपके इंस्टॉलेशन के बाद, संस्करण 1.4.3 और 1.4.4 भी उपलब्ध हैं, यदि आपके पैकेज में। इसे केवल ~ 1.4.2 के रूप में उपयोग किया जाता है, तो npm इंस्टॉल करें अपग्रेड के बाद आपके प्रोजेक्ट में 1.4.4 आपके प्रोजेक्ट में स्थापित होगा। लेकिन उस पैकेज के लिए 1.5.0 उपलब्ध है तो यह ~ द्वारा स्थापित नहीं किया जाएगा। इसे मामूली संस्करण कहा जाता है।

कैरेट ^ प्रमुख संस्करण से मेल खाता है, यदि आपकी परियोजना में 1.4.2 पैकेज स्थापित है और आपकी स्थापना 1.5.0 जारी होने के बाद फिर ^ प्रमुख संस्करण स्थापित करेगा। यदि आपके पास ^ 1.4.2 है तो यह 2.1.0 स्थापित करने की अनुमति नहीं देगा ।

निश्चित संस्करण यदि आप प्रत्येक स्थापना पर पैकेज के संस्करण को बदलना नहीं चाहते हैं, तो किसी भी विशेष वर्ण के साथ निश्चित संस्करण का उपयोग करें जैसे "1.4.2"

नवीनतम संस्करण * यदि आप नवीनतम संस्करण स्थापित करना चाहते हैं तो केवल पैकेज नाम के सामने * का उपयोग करें।


3
यह उत्तर भ्रामक है। सेमीवीयर में स्पष्ट रूप से कहा गया है, एक सामान्य संस्करण संख्या में जरूरी XYZ [जहां] X प्रमुख संस्करण है, Y लघु संस्करण है, और Z पैच संस्करण है।
सिंह

15

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

मानक संस्करण प्रणाली प्रमुख है ।minor.build (जैसे 2.4.1)

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

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

उदाहरण: ~ 2.4.1 का अर्थ है कि यह 2.4.x के लिए जाँच करेगा जहाँ x कुछ भी है

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

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


5
मैं इस उत्तर में 7 पंक्तियाँ देखता हूँ
फ्लक्सलैमूर

11

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

जब आप npm स्थापित क्षण --save करते हैं, तो यह पैकेज में प्रविष्टि को बचाता है। लापरवाह (^) उपसर्ग के साथ।

टिल्ड (~)

सबसे सरल शब्दों में, टिल्ड (~) सबसे हालिया लघु संस्करण (मध्य संख्या) से मेल खाता है। ~ 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


फिर, यह जवाब भ्रामक है। सेमीवीयर में स्पष्ट रूप से कहा गया है, एक सामान्य संस्करण संख्या में जरूरी XYZ [जहां] X प्रमुख संस्करण है, Y लघु संस्करण है, और Z पैच संस्करण है।
लियो

5

सेवर 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

टिल्डे (~)

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

"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

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

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

इसलिए यदि आप ~ 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 सेमेस्टर कैलकुलेटर देखें

प्रकाशित संकुल में npm शब्दार्थ संस्करण

शब्दार्थ संस्करण के बारे में npm प्रलेखन से अधिक


1

प्रति उत्तर नहीं, बल्कि एक अवलोकन, जिसे लगता है कि अनदेखी की गई है।

कैरेट श्रेणियों का विवरण:

देखें: https://github.com/npm/node-semver#caret-ranges-123-025-004

उन परिवर्तनों को अनुमति देता है जो [प्रमुख, मामूली, पैच] टपल में बाएं-सबसे गैर-शून्य अंक को संशोधित नहीं करते हैं।

मतलब है कि ^10.2.3मेल खाता है10.2.3 <= v < 20.0.0

मुझे नहीं लगता कि उनका यही मतलब है। 19.xx के माध्यम से संस्करणों को 11.xx में खींचने से आपका कोड टूट जाएगा।

मुझे लगता है कि उनका मतलब था left most non-zero number field। सेमीवीयर में ऐसा कुछ भी नहीं है जिसके लिए नंबर-फ़ील्ड को एकल-अंक की आवश्यकता हो।


0

~ मामूली संस्करण के रिलीज के लिए विशिष्टताओं ^ प्रमुख संस्करण रिलीज के लिए निर्दिष्ट करता है

उदाहरण के लिए यदि पैकेज संस्करण 4.5.2 है, तो अद्यतन ~ 4.5.2 पर नवीनतम 4.5.x संस्करण (लघु संस्करण) स्थापित होगा। 4.5.2 नवीनतम 4.xx संस्करण (मुख्य संस्करण) स्थापित करेगा


8
क्या आप इस बारे में विस्तार से बता सकते हैं कि 4 साल पहले पोस्ट किए गए एक ही उत्तर से यह उत्तर कैसे भिन्न है ?
फ्रैंकलिन यू

0

इस सवाल से संबंधित आप संस्करणों पर संगीतकार प्रलेखन की समीक्षा कर सकते हैं , लेकिन यहां संक्षेप में:

  • टिल्ड वर्जन रेंज ( ~ ) - ~ 1.2.3> = = 1.2.3 < 1.3.0 के बराबर है
  • कैरेट संस्करण रेंज ( ^ ) - ~ 1.2.3> = = 1.2.3 < 2.0.0 के बराबर है

तो, टिल्डे के साथ आपको पैच के स्वचालित अपडेट मिलेंगे लेकिन मामूली और प्रमुख संस्करण अपडेट नहीं होंगे। हालाँकि, यदि आप कैरट का उपयोग करते हैं तो आपको पैच और मामूली संस्करण मिलेंगे, लेकिन आपको प्रमुख (ब्रेकिंग परिवर्तन) संस्करण नहीं मिलेंगे।

टिल्ड संस्करण को "सुरक्षित" दृष्टिकोण माना जाता है, लेकिन यदि आप विश्वसनीय निर्भरता (अच्छी तरह से बनाए रखा पुस्तकालय) का उपयोग कर रहे हैं, तो आपको कैरट संस्करण के साथ कोई समस्या नहीं होनी चाहिए (क्योंकि मामूली बदलावों को तोड़ना नहीं चाहिए।

संगीतकार संस्थापन और संगीतकार अद्यतन के बीच अंतर के बारे में आपको इस स्टैकओवरफ़्लो पोस्ट की समीक्षा करनी चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.