पैकेज- lock.json को फिर से लिखना क्यों "npm स्थापित" करता है?


612

मैंने अभी हाल ही में npm @ 5 में अपग्रेड किया है । अब मेरे पास package.json की हर चीज के साथ एक पैकेज- lock.json फाइल है । मुझे उम्मीद है कि, जब मैं चलाऊंगा कि मेरे नोड_मॉड्यूल्स निर्देशिका में क्या स्थापित किया जाना चाहिए यह निर्धारित करने के लिए निर्भरता संस्करण लॉक फ़ाइल से खींच लिया जाएगा । क्या अजीब बात है कि यह वास्तव में मेरे पैकेज- lock.json फ़ाइल को संशोधित और फिर से लिखना समाप्त करता है।npm install

उदाहरण के लिए, लॉक फ़ाइल में संस्करण 2.1.6 में निर्दिष्ट टाइपस्क्रिप्ट थी । फिर, npm installकमांड के बाद , संस्करण को 2.4.1 में बदल दिया गया । यह एक लॉक फ़ाइल के पूरे उद्देश्य को हराने के लिए लगता है।

मैं क्या खो रहा हूँ? मुझे वास्तव में मेरी लॉक फ़ाइल का सम्मान करने के लिए npm कैसे मिलता है?


4
यह आपके प्रश्न का उत्तर नहीं देता है इसलिए उम्मीद है कि टिप्पणी ठीक है, लेकिन यार्न पर एक नज़र है। स्विचिंग में हमारे लिए एक घंटे से भी कम समय लगा।
कायकिनकोडर

4
एक ही समस्या है लेकिन यार्न github.com/yarnpkg/yarn/issues/570 (बहुत शिक्षाप्रद) का उपयोग करते हुए
यवेस एम।

2
मुझे भी वही समस्या हो रही है। package-lock.jsonजब मैं दौड़ता हूं तो मेरा उत्थान होता है npm install। यह एक npm बग की तरह खुशबू आ रही है। क्या आप अपनी खुद की रजिस्ट्री का उपयोग करते हैं?
HaNdTriX


@YvesM। --no-saveलॉकफ़ाइल को बदलने से रोकता है, लेकिन यह नासमझ प्रथम-स्तरीय निर्भरता को प्रभावित नहीं करता है जो ओपी का उल्लेख करता है।
रॉस एलन

जवाबों:


422

अद्यतन 3: जैसा कि अन्य उत्तर बताते हैं, npm ciकमांड को npm 5.7.0 में सीआई संदर्भ में तेज और प्रतिलिपि प्रस्तुत करने योग्य बिल्ड प्राप्त करने के लिए अतिरिक्त तरीके के रूप में पेश किया गया है। देखें प्रलेखन और NPM ब्लॉग अधिक जानकारी के लिए।


अद्यतन 2: प्रलेखन को अद्यतन करने और स्पष्ट करने का मुद्दा GitHub अंक # 18103 है


अद्यतन 1: नीचे वर्णित व्यवहार npm 5.4.2 में तय किया गया था: वर्तमान में इच्छित व्यवहार GitHub मुद्दे [17979] में उल्लिखित है ।


मूल जवाब: npm 5.1.0 के व्यवहार को मुद्दे # 16866 में चर्चा के अनुसार package-lock.jsonबदल दिया गया था । व्यवहार जिसे आप निरीक्षण करते हैं, जाहिरा तौर पर npm द्वारा संस्करण 5.1.0 के रूप में करना है।

इसका मतलब यह है कि जब भी एक नया संस्करण एक निर्भरता के लिए पाया जाता है package.jsonको ओवरराइड कर सकता package-lock.jsonहै package.json। यदि आप अपनी निर्भरता को प्रभावी ढंग से पिन करना चाहते हैं, तो आपको अब उपसर्ग के बिना संस्करणों को निर्दिष्ट करना होगा, उदाहरण के लिए, आपको उन्हें या 1.2.0इसके बजाय लिखने की आवश्यकता है । फिर के संयोजन और प्रतिलिपि प्रस्तुत करने योग्य बनाता है उपज होगा। स्पष्ट होने के लिए: अकेले अब रूट स्तर की निर्भरता को लॉक नहीं करता है!~1.2.0^1.2.0package.jsonpackage-lock.jsonpackage-lock.json

यह डिजाइन निर्णय अच्छा था या नहीं यह तर्क संगत है, # 17979 अंक में GitHub पर इस भ्रम के परिणामस्वरूप एक चर्चा चल रही है । (मेरी नजर में यह एक संदिग्ध निर्णय है; कम से कम नाम lockकिसी भी लंबे समय तक सही नहीं है।)

एक और पक्ष नोट: रजिस्ट्रियों के लिए एक प्रतिबंध भी है जो अपरिवर्तनीय पैकेजों का समर्थन नहीं करता है, जैसे कि जब आप npmjs.org के बजाय सीधे GitHub से पैकेज खींचते हैं। आगे के स्पष्टीकरण के लिए पैकेज लॉक के इस दस्तावेज को देखें ।


43
npm updateउसके बाद हैक क्या है ? : ओ मुझे वही एहसास हुआ है जो npm installअपडेटेड डिप्स है, लेकिन मैं इस पर विश्वास नहीं करना चाहता हूं .. लेकिन ऐसा लगता है कि यह दुख की बात सच है .. वैसे भी npm shrinkwrapडिप्स लॉक करने के लिए उपयोग करने का विकल्प अभी भी है , लेकिन निश्चित रूप से नाम पैकेज-लॉक गलत है क्योंकि यह न तो जमता है, न ही निर्भरता को बंद करता है ..
जुआरश

266
क्या झंझट है! दुनिया के सबसे बड़े पैकेज मैनेजर के पास अभी तक यह दस्तावेज नहीं है कि इसे कैसे काम करना चाहिए। हर कोई इस बारे में अनुमान लगा रहा है कि इसे क्या करना चाहिए और यह राय की लड़ाई में बदल जाता है। चर्चा अच्छी है लेकिन जंगली में रिलीज होने से पहले होनी चाहिए। किसी बिंदु पर किसी को अंतिम कॉल करने की आवश्यकता होती है और फिर उसे कार्यान्वित, प्रलेखित और जारी किया जा सकता है। PHP को समिति और तदर्थ द्वारा एक साथ डिज़ाइन किया गया था और देखो कि यह कैसे निकला। मैं एक ही बात को देखने के लिए नफरत करता हूँ एक उपकरण के लिए इस महत्वपूर्ण और व्यापक रूप से इस्तेमाल किया।
लैंडन पोच

85
फिर, पैकेज-लॉक का उपयोग करने का क्या मतलब है? मैंने सोचा था कि यह अलग-अलग कार्यक्षेत्रों में एक ही वातावरण बनाएगा, लेकिन पता चलता है कि यह कुछ भी नहीं कर रहा है
laltin

17
"फिर package.json और पैकेज- lock.json का संयोजन प्रतिलिपि प्रस्तुत करने योग्य बनाता है।" "पैकेज-लॉक.जसन" की यहां क्या भूमिका है? यदि कोई संस्करण उपसर्ग उपयोग नहीं किए जाते हैं तो "पैकेज.जसन" अकेले पहले से ही प्रतिलिपि प्रस्तुत करने योग्य बनाता है?
जैनीस एल्मेरिस

12
@ JANisElmeris मुझे लगता है कि package.json गहरी निर्भरता को बंद नहीं कर सकता है ...
जुआन मेंडेस

165

मैंने पाया है कि नए कमांड के साथ npm 5.7.1 का एक नया संस्करण npm ciहोगा, जो package-lock.jsonकेवल उसी से इंस्टॉल होगा

नया npm ci कमांड आपके लॉक-फाइल से ही इंस्टॉल होता है। यदि आपका package.json और आपकी लॉक-फाइल सिंक से बाहर है, तो यह एक त्रुटि की सूचना देगा।

यह आपके node_modules को फेंककर और इसे स्क्रैच से रीक्रिएट करके काम करता है।

आपको इस बात की गारंटी देने के साथ कि आप केवल वही प्राप्त करेंगे जो आपकी लॉक-फाइल में है, यह भी बहुत तेज़ है (2x-10x!) Npm स्थापित से जब आप एक नोड_मॉड्यूल्स के साथ शुरू नहीं करते हैं।

जैसा कि आप नाम से ले सकते हैं, हम इसे निरंतर एकीकरण वातावरण के लिए एक बड़ा वरदान मानते हैं। हम यह भी उम्मीद करते हैं कि git टैग से उत्पादन करने वाले लोग प्रमुख लाभ देखेंगे।


133
यह डिफ़ॉल्ट व्यवहार होना चाहिए अगर कोई लॉकफ़ाइल मौजूद है।
अशक्तता

13
इसलिए उन्होंने बदल दिया कि npm i कैसे काम करता है, केवल इसे npm ci महीने बाद वापस लाने के लिए?
स्कॉट फ्लैक

1
मैं अभी भी असमंजस में हूँ। दस्तावेज़ कहते हैं कि "सुनिश्चित करें कि आपके पास एक पैकेज-लॉक और एक अप-टू-डेट इंस्टॉल है: npm install"npm ci उस प्रोजेक्ट में कमांड चलाने से पहले । npm installपैकेज- lock.json फ़ाइल को अधिलेखित नहीं करता है ?
अदिगा

1
AFAIK: @adiga - संस्करण 5.4 से शुरू, npm केवल लॉक फ़ाइल को बदलता है यदि ऐसा करने के लिए, संकुल में युक्ति को पूरा करने के लिए .json । इसलिए यदि पैकेज कहते थे thatpackage: 1, और ताला कहता है ..: 1.0.4, तो देव कहने के लिए संपादित कर सकते हैं thatpackage: 2- और यह लॉक फ़ाइल को बदलने के लिए मजबूर करेगा, क्योंकि 1.0.4नव निर्दिष्ट सीमा के साथ संगत नहीं है। यदि नहीं बदला तो packages.jsonलॉक फ़ाइल को हटाने तक, सटीक संस्करण पर लॉक रहेगा। [अगर लॉक नहीं रहता है, और उसने पैकेज नहीं बदले हैं। तो, बग रिपोर्ट दर्ज करें।]
टूलमेकरसैट

1
@George मैं (npm के हाल के संस्करणों के लिए) पढ़ी गई जानकारी से, और मेरे सीमित परीक्षण: हाँ दोनों के लिए।
वेनरिक्स

95

नए शुरू किए गए का उपयोग करें

npm ci

npm ci बड़ी टीमों के लिए सबसे अधिक लाभ का वादा करता है। डेवलपर्स को पैकेज लॉक पर "साइन ऑफ" करने की क्षमता देने से बड़ी टीमों में अधिक कुशल सहयोग को बढ़ावा मिलता है, और एक लॉकफाइल में वही स्थापित करने की क्षमता है जो दसियों को बचाने की क्षमता रखता है यदि महीने में सैकड़ों डेवलपर घंटे नहीं, टीमों को मुक्त करें अधिक समय के निर्माण और अद्भुत चीजों को शिपिंग करने के लिए।

npm ciतेजी से, अधिक विश्वसनीय बनाता है के लिए परिचय


3
यह मुझे सही लगता है? क्या कोई और पुष्टि कर सकता है?
phouse512

6
@ phouse512 यह सही है। हम बहुत अधिक केवल उपयोग करते हैं npm ci, और केवल उपयोग करते हैं npm installयदि नए पैकेजों को अपडेट या इंस्टॉल करते हैं।
जैकब सिवर्स

1
हाल की टिप्पणियाँ, आदि यह उत्तर मैं के साथ जा रहा हूँ। बहुत बुरा वे भयानक तड़क-भड़क को ठीक नहीं करते हैं, लेकिन यदि नया सुसमाचार "एनपीएम सीआई" है, तो ठीक है। मैं अनुकूलन कर सकता हूं।
स्वेग

बहुत बुरा यह हमेशा एक मौजूदा node_modulesनिर्देशिका को हटाता है और स्थानीय रूप से फिर से बनाता है, भले ही वह एक खाली या महत्वपूर्ण सिम्लिंक हो। :(
जो एटजबर्गर

2
@ToolmakerSteve अपनी सांस मत पकड़ो! मुझे लगता है कि डायरेक्टरी के कंटेंट को डिलीट करने से डाइरेक्टरी सिर्फ डिलीट होने की तुलना में धीमी होगी। आपको सामग्री की गणना करनी होगी, फिर ओ / एस के लिए केवल एक डिलीट कमांड के बजाय डिलीट कमांड की एक श्रृंखला जारी करनी होगी। प्रदर्शन के मुद्दों के साथ पहले npm पर समतल किया गया था और सुधार का उपयोग करते हुए npm ciमुझे उम्मीद है कि वे कुछ भी शुरू करने के लिए बहुत अनिच्छुक होंगे जो कि काफी असामान्य उपयोग के मामले के लिए प्रदर्शन को कम कर सकते हैं। आप डिस्क उपयोग को कम करने के लिए हार्ड लिंक का उपयोग करने वाले pnpm.js.org को देखना चाहते हैं ।
काल्टर

64

संक्षिप्त जवाब:

  • npm install पैकेज- lock.json को केवल तभी सम्मानित करता है जब यह पैकेज की आवश्यकताओं को पूरा करता है।
  • यदि यह उन आवश्यकताओं को पूरा नहीं करता है, तो पैकेज अपडेट किए जाते हैं और पैकेज-लॉक ओवरराइट किया जाता है।
  • यदि आप बिल्ड को विफल करते हैं, तो ऐसा होने पर पैकेज-लॉक को फिर से लिखें npm ci

यहाँ एक परिदृश्य है जो चीजों को समझा सकता है (एनपीएम 6.3.0 के साथ सत्यापित)

आप पैकेज में निर्भरता घोषित करते हैं। जैसे:

"depA": "^1.0.0"

तो फिर तुम करो, npm installजो एक पैकेज- lock.json के साथ उत्पन्न करेगा:

"depA": "1.0.0"

कुछ दिनों बाद, "डिपा" का एक नया लघु संस्करण जारी किया गया, जो "1.1.0" कहता है, फिर निम्नलिखित सच है:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

इसके बाद, आप मैन्युअल रूप से अपने package.json को अपडेट करें:

"depA": "^1.1.0"

फिर रेरून:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)

4
यह वास्तव में एक "लॉक" फ़ाइल का इच्छित व्यवहार है। जाहिर है, यह एनपीएम के पुराने संस्करणों के साथ ऐसा नहीं था।
ब्लॉकस्टो

1
फिर npm package.json के अंतिम अपडेट को कैसे ट्रैक करता है? जब आप अपने package.json और package-lock.json को किसी अन्य कंप्यूटर पर ले जाते हैं तो क्या होता है? नए कंप्यूटर में npm को कैसे पता चलता है कि package.lock मूल एक है या इसे अपडेट किया गया है, यह तय करने के लिए कि क्या इसे package-lock.json को अपडेट करने की आवश्यकता है या नहीं?
लाहिरू चंदिमा

3
@LahiruChandima यह वास्तव में अपडेट को ट्रैक नहीं करता है। npm installलॉक किए गए संस्करणों का उपयोग package-lock.jsonतब तक करेगा जब तक कि वह इस बात से संतुष्ट नहीं हो जाता है कि वह package.jsonकिस स्थिति में पैकेज.जसन स्थापित करता है और पैकेज-लॉक को फिर से बनाता है। यदि आपने अपने package.jsonतरीके को इस तरह से बदल दिया है कि मौजूदा पैकेज-लॉक अभी भी अपडेट को संतुष्ट करता है तो package.jsonइसका उपयोग जारी रहेगाpackage-lock
अहमद अब्देलघानी

1
यदि आपके पास पहले से ही नोड_मॉड्यूल में एक मॉड्यूल है जो पैकेज की आवश्यकताओं को पूरा करता है। तो npm installपैकेज-लॉक.जॉसन की परवाह किए बिना कुछ भी नहीं करता है। जब पैकेज उपलब्ध हैं, तब भी हमें स्पष्ट रूप से पैकेज अपडेट करना होगा। कम से कम वर्षों से मेरा यही अनुभव रहा है।
carlin.scott

1
@ToolmakerSteve मैं भी व्यवहार से उलझन में था @ carlin.scott ने सूचना दी, लेकिन मैंने अभी इसका परीक्षण किया है, और वास्तव में वह सही है। यदि संस्करण भीतर node_modulesश्रेणी को संतुष्ट करता है package.jsonऔर कोई package-lock.jsonफ़ाइल नहीं है, तो npm मॉड्यूल को चलाते समय अद्यतन नहीं करेगा npm install। मुझे लगता है कि यह तब से ठीक है जब आप निर्भरता को अद्यतन करने के लिए npm update(या npm-checkनवीनतम के लिए) का उपयोग कर सकते हैं , और यह व्यवहार किसी के मामले में सिर्फ एक प्रविष्टि जोड़ने के लिए तेज़ है package.json, और असंबंधित पैकेजों को खुद को नवीनतम तक अद्यतन करने के लिए नहीं चाहते हैं जो अर्ध-क्रिया को संतुष्ट करता है रेंज।
वेनरिक्स

19

के npm ciबजाय आदेश का उपयोग करें npm install

"ci" का अर्थ "निरंतर एकीकरण" है।

यह lenient package.json फ़ाइल निर्भरता के बजाय पैकेज- lock.json फ़ाइल के आधार पर प्रोजेक्ट निर्भरता स्थापित करेगा।

यह आपकी टीम के साथियों के समान निर्माण करेगा और यह बहुत तेज भी है।

आप इसके बारे में इस ब्लॉग पोस्ट में और अधिक पढ़ सकते हैं: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable


2
ciडॉक्स और ब्लॉग पोस्ट में वर्णित "निरंतर एकीकरण" को संदर्भित करता है, जो कमांड की घोषणा करता है: blog.npmjs.org/post/171556855892/…
जो एत्ज़बर्गर

धन्यवाद जो। मैंने अपना उत्तर सही नाम के साथ अपडेट किया है और ब्लॉग पोस्ट से जुड़ा हुआ हूं। Reading (इसे पढ़ने वालों के लिए, पहले मैंने कहा था कि यह "क्लीन इन्स्टॉल" के लिए खड़ा है)
डैनियल टोनन

"और यह बहुत तेज है" - यह node_modulesफ़ोल्डर को हटा देगा और इसे फिर से खरोंच से बना देगा। क्या यह वास्तव में बहुत तेज है? क्या npm installनष्ट node_modulesफ़ोल्डर, भी?
izogfif

मुझे लगता है कि गति npm से आती है जिसे डाउनलोड करने के लिए पैकेजों की गणना करने की आवश्यकता नहीं है। इसके बारे में सोचें जैसे npm installचलाने पर सभी पैकेज निर्भरता को हल करना है। npm ciसिर्फ "इन सटीक मॉड्यूल प्राप्त करें" की खरीदारी सूची है।
डैनियल टोनन

8

भविष्य में, आप इसे संशोधित किए बिना केवल से --from-lock-fileस्थापित करने के लिए (या समान) ध्वज का उपयोग करने में सक्षम होंगे ।package-lock.json

यह सीआई, आदि वातावरणों के लिए उपयोगी होगा जहां प्रजनन योग्य बिल्ड महत्वपूर्ण हैं।

फीचर की ट्रैकिंग के लिए https://github.com/npm/npm/issues/18286 देखें ।


मुझे शक है। यदि विभिन्न संचालन प्रणालियों के लिए निर्भरताएं अलग-अलग हैं, तो आप किसी ऐसी चीज को कैसे स्थापित कर सकते हैं जो काम नहीं करेगी?
येवगेनी अफानासयेव

4
@YevgeniyAfanasyev उस झंडे के बजाय, इसे लागू किया गया था npm ciजो आपके प्रश्न को भी संभालता है।
spex

8

ऐसा प्रतीत होता है कि यह समस्या npm v5.4.2 में तय की गई है

https://github.com/npm/npm/issues/17979

(थ्रेड में अंतिम टिप्पणी के लिए नीचे स्क्रॉल करें)

अपडेट करें

वास्तव में 5.6.0 में तय किया गया। 5.4.2 में एक क्रॉस प्लेटफॉर्म बग था जो इस समस्या को अभी भी उत्पन्न कर रहा था।

https://github.com/npm/npm/issues/18712

अपडेट २

मेरा उत्तर यहाँ देखें: https://stackoverflow.com/a/53680257/1611058

npm ci मौजूदा परियोजनाओं को स्थापित करते समय आप जिस कमांड का उपयोग कर रहे हैं वह होना चाहिए।


5
मैं 5.4.2 का उपयोग कर रहा हूं और यह अभी भी मेरे पैकेज- lock.json के संशोधन के परिणामस्वरूप है npm i। उदाहरण के लिए, मॉड्यूल fseventsको तब हटा दिया जाता है जब मैं npm iउस मशीन पर होता हूं जो समर्थन नहीं करती है fseventsऔर तब मॉड्यूल फिर से जोड़ा जाता है जब npm iएक मशीन पर फिर से होता है।
hrdwdmrbl

फिर आपको इसे समझाते हुए npm GitHub रेपो में एक नया मुद्दा उठाना चाहिए। यदि यह काम नहीं करता है कि वे कैसे कहते हैं कि यह काम करने वाला है तो वे इसे एक उच्च प्राथमिकता वाले बग के रूप में देखते हैं जिसे तत्काल ठीक करने की आवश्यकता है।
डैनियल टोनन

मैक ओएस एक्स योगदानकर्ताओं के साथ सहयोग करते हुए @hrdwdmrbl मैं fseventsअपने package-lock.jsonसाथ एक ही ड्रॉप देख रहा हूं npm@5.5। यदि आपने कोई मुद्दा नहीं खोला है, तो मैं लूंगा।
एक्स

@hrdwdmrbl मैंने अपनी टिप्पणी छोड़ने के बाद (और संबद्ध मुद्दों का लंबा धागा) पाया कि अपनी टिप्पणी को अपडेट करने के लिए SO पर वापस आना भूल गया। मेरी पीठ पाने के लिए धन्यवाद। सब कुछ ठीक है।
एक्स

4

आपके पास शायद कुछ ऐसा है:

"typescript":"~2.1.6"

आपके package.jsonnpm में नवीनतम माइनर संस्करण में अपडेट किया गया है, आपके मामले में2.4.1

संपादित करें: ओपी से प्रश्न

लेकिन यह स्पष्ट नहीं करता है कि "npm इंस्टॉल" लॉक फ़ाइल को क्यों बदलेगा। क्या लॉक फ़ाइल एक प्रतिलिपि प्रस्तुत करने योग्य निर्माण बनाने के लिए नहीं है? यदि हां, तो सेमर मूल्य की परवाह किए बिना, इसे अभी भी उसी 2.1.6 संस्करण का उपयोग करना चाहिए।

उत्तर:

यह आपके पूर्ण निर्भरता के पेड़ को बंद करने का इरादा है। आइए बताते हैं typescript v2.4.1आवश्यकता widget ~v1.0.0। जब आप npm इसे पकड़ लेते हैं widget v1.0.0। बाद में अपने साथी डेवलपर (या CI बिल्ड) पर एक npm इंस्टॉल और हो जाता है, typescript v2.4.1लेकिन widgetइसे अपडेट कर दिया गया है widget v1.0.1। अब आपका नोड मॉड्यूल सिंक से बाहर है। यह वही है जो package-lock.jsonरोकता है।

या अधिक आम तौर पर:

एक उदाहरण के रूप में, विचार करें

पैकेज ए:

{"नाम": "ए", "संस्करण": "0.1.0", "निर्भरता": {"बी": "<0.1.0"}}

पैकेज बी:

{"नाम": "बी", "संस्करण": "0.0.1", "निर्भरता": {"C": "<0.1.0"}}

और पैकेज सी:

{"नाम": "सी", "संस्करण": "0.0.1"}

यदि ये रजिस्ट्री में ए, बी और सी के केवल संस्करण हैं, तो एक सामान्य एनपीएम स्थापित ए स्थापित होगा:

A@0.1.0 - B@0.0.1 - C@0.0.1

हालाँकि, यदि B@0.0.2 प्रकाशित हुआ है, तो एक नया npm स्थापित होगा A स्थापित होगा:

A@0.1.0 - B@0.0.2 - C@0.0.1 ने माना कि नए संस्करण ने B की निर्भरता को संशोधित नहीं किया है। बेशक, बी के नए संस्करण में सी का नया संस्करण और नई निर्भरता के किसी भी संख्या को शामिल किया जा सकता है। यदि ऐसे परिवर्तन अवांछनीय हैं, तो A का लेखक B@0.0.1 पर निर्भरता निर्दिष्ट कर सकता है। हालाँकि, यदि A का लेखक और B का लेखक एक ही व्यक्ति नहीं हैं, तो A के लेखक के पास यह कहने का कोई तरीका नहीं है कि वह C के नए प्रकाशित संस्करणों में तब खींचना नहीं चाहता है जब B बिल्कुल नहीं बदला है।


ओपी प्रश्न 2: इसलिए मुझे यह देखने दें कि क्या मैं सही तरीके से समझता हूं। आप क्या कह रहे हैं कि लॉक फ़ाइल द्वितीयक निर्भरता के संस्करणों को निर्दिष्ट करती है, लेकिन फिर भी शीर्ष स्तर की निर्भरता निर्धारित करने के लिए package.json के फजी मिलान पर निर्भर करती है। क्या यह सही है?

उत्तर: नहीं। पैकेज-लॉक पूरे पैकेज ट्री को लॉक करता है, जिसमें वर्णित मूल पैकेज भी शामिल है package.json। यदि आपके में typescriptबंद है , तो इसे उस तरह से रहना चाहिए जब तक कि इसे बदल न दिया जाए। और कहते हैं कि कल रिलीज संस्करण । अगर मैं आपकी शाखा की जांच करूं और चलाऊं, तो npm लॉकफाइल का सम्मान करेगा और इंस्टॉल करेगा ।2.4.1package-lock.jsontypescript2.4.2npm install2.4.1

अधिक पर package-lock.json:

package-lock.json स्वचालित रूप से किसी भी ऑपरेशन के लिए उत्पन्न होता है जहाँ npm या तो नोड_मॉड्यूल्स ट्री, या package.json को संशोधित करता है। यह सटीक पेड़ का वर्णन करता है जो उत्पन्न किया गया था, जैसे कि बाद में स्थापित मध्यवर्ती निर्भरता अपडेट की परवाह किए बिना, समान पेड़ उत्पन्न करने में सक्षम हैं।

यह फ़ाइल स्रोत रिपॉजिटरी में प्रतिबद्ध है, और विभिन्न उद्देश्यों के लिए काम करती है:

एक निर्भरता के पेड़ के एकल प्रतिनिधित्व का वर्णन करें जैसे कि टीम के साथी, तैनाती और निरंतर एकीकरण की गारंटी एक ही निर्भरता को स्थापित करने के लिए दी जाती है।

उपयोगकर्ताओं को "टाइम-ट्रैवल" करने के लिए नोड_मॉडल्स के पिछले राज्यों को एक निर्देशिका प्रदान करने की सुविधा उपलब्ध कराएं।

पठनीय स्रोत नियंत्रण के माध्यम से वृक्ष परिवर्तनों की अधिक दृश्यता की सुविधा के लिए।

और पहले से स्थापित पैकेजों के लिए दोहराया मेटाडेटा प्रस्तावों को छोड़ने के लिए npm की अनुमति देकर स्थापना प्रक्रिया का अनुकूलन करें।

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


29
लेकिन यह स्पष्ट नहीं करता है कि "npm इंस्टॉल" लॉक फ़ाइल को क्यों बदलेगा। क्या लॉक फ़ाइल एक प्रतिलिपि प्रस्तुत करने योग्य निर्माण बनाने के लिए नहीं है? यदि हां, तो सेमर मूल्य की परवाह किए बिना, इसे अभी भी उसी 2.1.6 संस्करण का उपयोग करना चाहिए।
वाइपर बेली

3
और वह बात मैं कह रहा हूं। मेरा पैकेज लॉक फ़ाइल टाइपस्क्रिप्ट@2.1.6 कहती है, लेकिन जब मैं एनपीएम इंस्टॉल करता हूं, तो एंट्री टाइप टाइप किया जाता है।
वाइपर बैली

5
मैंने इसी मुद्दे का अनुभव किया है। हमारे CI / CD में, package-lock.jsonनीचे खींचा जाता है और फिर हम दौड़ते हैं npm install, लेकिन package-lock.jsonफ़ाइल को संशोधित किया जाता है और अगले बदलावों को खींचने से पहले हमें एक रीसेट करना होगा।
BayssMekanique

15
मुझे नहीं मिला। यह एक "लॉक" फ़ाइल कैसे है अगर बाद में स्थापित अभी भी उन्नयन कर सकते हैं ?!
रॉस एलन

5
मुझे लगता है कि उन्होंने इस फ़ाइल को "जानकारी" और "लॉक" के रूप में शुरू करने के विचार से शुरू किया और फिर, निर्णय लिया कि यह केवल एक "जानकारी" फ़ाइल होगी। बेहतर नाम "पैकेज- info.json" होगा। मुझे एक "एनपीएम इंस्टॉल -लॉक" पसंद आएगा जो "पैकेज-लॉक.जसन" से इंस्टॉल होगा और "पैकेज.जॉन" को अनदेखा करेगा
जेरेमी चोन

2

संभवतः आपको कुछ इस तरह का उपयोग करना चाहिए

npm ci

उपयोग करने के बजाय npm install यदि आप अपने पैकेज के संस्करण को बदलना नहीं चाहते हैं।

आधिकारिक दस्तावेज के अनुसार, दोनों npm installऔर npm ciनिर्भरता जो इस परियोजना के लिए आवश्यक हैं स्थापित करें।

मुख्य अंतर यह है, संदर्भ के रूप में npm installलेने वाले पैकेजों को स्थापित करता है packge.json। जहां के मामले में npm ci, यह package-lock.jsonसंदर्भ के रूप में लेने वाले पैकेजों को स्थापित करता है, यह सुनिश्चित करते हुए कि हर बार सटीक पैकेज स्थापित होता है।



0

संपादित करें: "लॉक" नाम एक मुश्किल है, इसकी एनपीएम यार्न के साथ पकड़ने की कोशिश कर रही है। यह कोई बंद फाइल नहीं है। package.jsonएक उपयोगकर्ता-नियत फ़ाइल है, जो एक बार "इंस्टॉल" नोड_मॉड्यूल फ़ोल्डर ट्री उत्पन्न करेगा और उस पेड़ को फिर लिखा जाएगा package-lock.json। तो आप देखते हैं, इसका दूसरा तरीका - निर्भरता संस्करण package.jsonहमेशा की तरह खींच लिया जाएगा , और package-lock.jsonबुलाया जाना चाहिएpackage-tree.json

(आशा है कि इसने मेरा उत्तर स्पष्ट कर दिया, इतने सारे डाउनवोट के बाद)


एक सरलीकृत उत्तर: package.jsonआपकी निर्भरता हमेशा की तरह है, जबकि package-lock.json"एक सटीक, और अधिक महत्वपूर्ण रूप से प्रतिलिपि प्रस्तुत करने योग्य नोड_मॉड्यूल्स ट्री" ( एनपीएम डॉक्स से ही लिया गया है )।

मुश्किल नाम के रूप में, इसकी एनपीएम यार्न के साथ पकड़ने की कोशिश कर रही है।


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