Npm-संकोwrap.json और package-lock.json में क्या अंतर है?


158

Npm @ 5 की रिलीज के साथ , यह अब लिखेगा package-lock.jsonजब तक कि npm-shrinkwrap.jsonपहले से मौजूद नहीं है।

मैंने npm @ 5 को विश्व स्तर पर स्थापित किया:

npm install npm@5 -g

और अब, अगर एक के npm-shrinkwrap.jsonदौरान पाया जाता है:

npm install

एक चेतावनी छपी होगी:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

तो मेरा टेक-ऑफ यह है कि मैं सिक्रैप को रिप्लेस कर दूं package-lock.json

फिर भी इसके लिए एक नया प्रारूप क्यों है? क्या कर सकते package-lock.jsonहैं कि npm-shrinkwrap.jsonनहीं कर सकते हैं?

जवाबों:


176

फ़ाइलें वास्तव में एक ही सामग्री है, लेकिन कैसे NPM हैंडल उन्हें, पर वर्णित में मतभेद के एक मुट्ठी भर देखते हैं डॉक्स साइट में है और यह भी NPM रेपो में एक डॉक्स फ़ाइल कि स्पष्ट रूप से इन दो फ़ाइलों के बीच अंतर को संबोधित द्वारा शुरू होता है :

  • package-lock.jsonnpm पर कभी प्रकाशित नहीं होता npm-shrinkwrapहै , जबकि डिफ़ॉल्ट रूप से होता है
  • package-lock.json फ़ाइलें जो शीर्ष-स्तरीय पैकेज में नहीं हैं, उन्हें अनदेखा किया जाता है, लेकिन निर्भरता से संबंधित संकोचन फ़ाइलों का सम्मान किया जाता है
  • npm-shrinkwrap.jsonnpm संस्करणों 2, 3 और 4 के साथ पीछे की ओर संगत है, जबकि package-lock.jsonकेवल npm 5+ से पहचाना जाता है

आप किसी मौजूदा package-lock.jsonको npm-shrinkwrap.jsonचलाकर परिवर्तित कर सकते हैं npm shrinkwrap

इस प्रकार:

  • यदि आप अपने पैकेज को npm पर प्रकाशित नहीं कर रहे हैं, तो इन दो फ़ाइलों के बीच का चुनाव थोड़ा परिणाम है। आप इसका उपयोग करना चाह सकते हैं package-lock.jsonक्योंकि यह डिफ़ॉल्ट है और इसका नाम npm शुरुआती के लिए स्पष्ट है; वैकल्पिक रूप से, आप npm-shrinkwrap.jsonnpm 2-4 के साथ पश्चगामी संगतता के लिए उपयोग करना चाह सकते हैं यदि आपके लिए यह सुनिश्चित करना मुश्किल है कि आपकी विकास टीम npm 5+ पर है। (ध्यान दें कि npm 5 को 25 मई 2017 को जारी किया गया था; पीछे की संगतता कम और कम महत्वपूर्ण हो जाएगी क्योंकि हम उस तारीख से प्राप्त करेंगे, क्योंकि अधिकांश लोग अंततः अपग्रेड करेंगे।)
  • यदि आप अपना पैकेज npm पर प्रकाशित कर रहे हैं , तो आपके पास एक विकल्प है:

    1. एक का उपयोग कर package-lock.jsonवास्तव में निर्भरता आप स्थापित की जो संस्करण रिकॉर्ड करने के लिए है, लेकिन साथ संस्करण आपके द्वारा तय सीमाओं अपने पैकेज को स्थापित करने से लोगों को निर्भरता कि संगत है के किसी भी संस्करण का उपयोग करने के लिए अनुमति देता है package.json, या
    2. एक का उपयोग कर npm-shrinkwrap.jsonकि जो कोई अपने पैकेज को स्थापित करता है हो जाता है की गारंटी करने के बिल्कुल सभी निर्भरता के समान संस्करण


    डॉक्स में वर्णित आधिकारिक दृश्य (बहुत थकाऊ) यह है कि विकल्प 1 का उपयोग पुस्तकालयों के लिए किया जाना चाहिए (संभवतः पैकेज के दोहराव की मात्रा को कम करने के लिए जब पैकेज की बहुत सारी निर्भरताएं समान माध्यमिक निर्भरता के थोड़े अलग संस्करणों पर निर्भर करती हैं) , लेकिन यह विकल्प 2 उन निष्पादनयोग्य लोगों के लिए उचित हो सकता है जो विश्व स्तर पर स्थापित होने जा रहे हैं।


2
+1 - क्या आप अपने दूसरे बुलेट पॉइंट को स्पष्ट कर सकते हैं? उस व्यवहार और एनपीएम-सिक्योरवैप होने में क्या अंतर है?
Rhys

2
जब तक आप कुछ अजीब नहीं कर रहे हैं @Rhys दूसरी गोली व्यवहार में कोई फर्क नहीं पड़ेगा। मूल रूप से, यह सिर्फ यह कहता है कि यदि किसी पुस्तकालय ने किसी तरह package-lock.json(जो संभव नहीं है) प्रकाशित किया है, तो यदि आप उस पुस्तकालय को किसी अन्य पैकेज की निर्भरता के रूप में स्थापित करते हैं, तो पुस्तकालय package-lock.jsonको एनपीएम द्वारा अनदेखा किया जाएगा। हालांकि, एक पुस्तकालय एक प्रकाशित करता है, तो npm-shrinkwrap.json, और आप एक निर्भरता के रूप में पुस्तकालय स्थापित है, तो आप करेंगे भी माध्यमिक निर्भरता के रूप में स्थापित करने के लिए सटीक संस्करणों लाइब्रेरी की में निर्दिष्ट सभी निर्भरता की npm-shrinkwrap.json
मार्क अमेरी

क्या आप कृपया केवल पढ़ने के npm ciलिए इंस्टाल करने के लिए मौजूद package-lock.jsonहैं। ( npm installMutates package-lock.jsonके कारण भ्रम की स्थिति और संभावित कीड़े और का लाभ नहीं ले करता है package-lock.jsonदर असल।)
k0pernikus

@ k0pernikus मुझे नहीं लगता कि npm ciहैंडल के बीच कोई अंतर है npm-shrinkwrap.jsonऔर package-lock.json- दो फाइलों के बीच अंतर के बारे में इस सवाल की इसकी प्रासंगिकता क्या है? इसके अलावा, चारों ओर पढ़ने के बाद: मुझे लगता है कि " npm install... का फायदा नहीं उठाता है package-lock.json" npm 5.4 के बाद से झूठा हो गया है - मुझे विश्वास है कि npm installअब आपका सम्मान करता है package-lock जब तक कि यह आपके साथ बिल्कुल असंगत नहीं है package.json, जिस स्थिति में उत्तरार्द्ध पूर्ववर्ती होगा। (लेकिन मैं थोड़ी सी के लिए जावास्क्रिप्ट दुनिया से बाहर हो गया हूं - क्या मैं कुछ याद कर रहा हूं?)
मार्क अमेरी

27

एनपीएम डेवलपर से स्पष्टीकरण :

पैकेज-लॉक.जॉन के लिए विचार निश्चित रूप से नवीनतम और सबसे बड़ा सिकुड़ा हुआ प्रौद्योगिकी में है, और npm-compresswrap.json को उन कीमती कुछ लोगों के लिए आरक्षित किया जाना चाहिए जो अपने पुस्तकालयों के बारे में बहुत सटीक नोड -मॉड्यूल्स रखते हैं - और उन लोगों के लिए जो अपने npm संस्करण को टक्कर दिए बिना एक विशेष पेड़ को स्थापित करने के लिए npm @> = 2 का उपयोग करके CI चाहते हैं।

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


18
मैं अभी भी अंतर पर स्पष्ट नहीं हूं। यदि npm-shrinkwrapसटीक नोड_मॉड्यूल्स के लिए है .... मेरा मानना package-lock.jsonहै कि सटीक से कम लॉकिंग है? और यदि हां, तो क्या लॉक नहीं है npm-shrinkwrapजो लॉक हो रहा है?
dman

आपको यह गलत लगा @dman पैकेज-लॉक एनपीएम-सिक्योरवैप का नया संस्करण है। पैकेज-लॉक ऑप्ट-आउट है (इसलिए आपको सुविधा को हटाना होगा क्योंकि यह डिफ़ॉल्ट रूप से सक्षम है), एनपीएम-सिक्रेटवैप ऑप्ट-इन है (इसलिए आपको इसे सक्षम करना होगा क्योंकि यह मेरा डिफ़ॉल्ट शामिल नहीं है)। कारण है कि उन्होंने पैकेज-लॉक की शुरुआत की है कि 1. उपयोगकर्ता के पास अब निर्भरता से निपटने का एक सुरक्षित तरीका है क्योंकि यह डिफ़ॉल्ट रूप से सक्षम है और 2. नाम का अर्थ है कि यह "सिक्रेटवैप" के लिए ऑपोसिट में है। एनपीएम-सिक्योरवैप में कुछ विशेष निर्भरता-व्यवहार सेटिंग्स थीं जो पैकेज-लॉक अब नहीं है। npm-संकोचन अब अप्रचलित है।
SeriousM

10
यह गलत है। यह कहते हुए कि पैकेज-लॉक एनपीएम-सिक्रेटवैप का नया संस्करण है, आप कह रहे हैं कि यह एक प्रतिस्थापन है। एनपीएम-सिक्योरवैप को हटा नहीं है और पैकेज-लॉक.जसन के साथ मतभेद हैं। इसके अलावा, पैकेज- lock.json में एक बग है, जबकि npm-संकोचनट्रैप नहीं है ... इस प्रकार अधिक जोर देने पर वे समान कोड नहीं हैं।
dman

इसके अलावा पैकेज- lock.json घुसपैठ है। यदि आप "npm i" कहते हैं तो यह आसानी से scm विरोधों का कारण बन सकता है, जबकि संकोचन स्पष्ट रूप से उत्पन्न किया जाना चाहिए और ci सर्वर पर टकराव का कारण नहीं होगा। हां, मैं यहां गलत हो सकता हूं।
नोरेखोव

@dman "पैकेज- lock.json में एक बग है, जबकि npm-compresswrap नहीं है" - नहीं यह नहीं है। आप जिस मुद्दे से जुड़े हुए हैं, उसमें इसका कोई संकेत नहीं है; यह भी उल्लेख नहीं करता है npm-shrinkwrap। जैसा कि मैंने अपने उत्तर में नोट किया है, ए package-lock.jsonको परिवर्तित npm-shrinkwrap.jsonकरना शाब्दिक रूप से सिर्फ फ़ाइल का नाम बदलकर किया जाता है; वे कर रहे हैं "एक ही कोड"।
मार्क अमेरी

12

मुझे लगता है कि यह विचार था कि - सेव और सिक्योरव्रैप डिफ़ॉल्ट रूप से होता है, लेकिन किसी भी संभावित मुद्दों से हटने के साथ ऐसा हो रहा है जहां यह नहीं चाहता था। इसलिए, उन्होंने किसी भी टकराव से बचने के लिए इसे नया नाम दिया। Npm से किसी ने इसे यहाँ और अधिक अच्छी तरह समझाया:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

प्रासंगिक उद्धरण:

npm डिफ़ॉल्ट रूप से आपके स्रोत निर्देशिका में अधिकांश फ़ाइलों को प्रकाशित करता है, और लोग सालों से संकोचन प्रकाशित कर रहे हैं। हम संगतता को तोड़ना नहीं चाहते थे। डिफ़ॉल्ट रूप से --save और संकोचन के साथ, इसमें गलती से इसे बनाने और रजिस्ट्री के माध्यम से प्रचार करने का एक बड़ा जोखिम था, और मूल रूप से डिप्स और डुप्लीकेट ... null को अपडेट करने की हमारी क्षमता को प्रस्तुत करता है।

इसलिए हमने एक नया नाम चुना। और हमने अचानक एक नया नाम चुना। नया लॉकफाइल मूल रूप से सभी समान कोड, सटीक समान प्रारूप साझा करता है

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