पैकेज- lock.json की भूमिका क्या है?


291

npm @ 5 प्रकाशित किया गया है, इसमें एक नया फीचर पैकेज-लॉक.जसन फ़ाइल (बाद npm install) है जो मुझे भ्रमित करता है। मैं जानना चाहता हूं, इस फाइल का क्या प्रभाव है?

जवाबों:


291

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

से NPM डॉक्स :

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

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

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

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

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

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

संपादित करें

पैकेज का उपयोग करने के बारे में नीचे जराहली के प्रश्न का उत्तर देने के लिए। सटीक संस्करण संख्याओं के साथ ही। ध्यान रखें कि आपके package.json में केवल आपकी प्रत्यक्ष निर्भरता होती है, न कि आपकी निर्भरता (कभी-कभी नेस्टेड निर्भरताएं) की निर्भरता। इसका मतलब मानक पैकेज के साथ है। यदि आप उन नेस्टेड निर्भरता के संस्करणों को नियंत्रित नहीं कर सकते हैं, तो उन्हें सीधे संदर्भित या सहकर्मी निर्भरता के रूप में मदद नहीं करेंगे क्योंकि आप उस संस्करण की सहिष्णुता को भी नियंत्रित नहीं करते हैं जो आपकी प्रत्यक्ष निर्भरता इन नेस्टेड निर्भरता के लिए परिभाषित करती है। ।

यहां तक ​​कि अगर आप अपने प्रत्यक्ष निर्भरता के संस्करणों को बंद करते हैं, तो आप 100% गारंटी नहीं दे सकते हैं कि आपका पूर्ण निर्भरता पेड़ हर बार समान होगा। दूसरे आप अपने प्रत्यक्ष निर्भरता के गैर-ब्रेकिंग परिवर्तन (सिमेंटिक संस्करण के आधार पर) की अनुमति देना चाह सकते हैं जो आपको नेस्टेड निर्भरता का कम नियंत्रण भी प्रदान करता है और आप फिर से गारंटी नहीं दे सकते हैं कि आपके सीधे निर्भरता कुछ बिंदुओं पर सिमेंटिक संस्करण नियम नहीं तोड़ेंगे खुद को।

इस सबका समाधान लॉक फाइल है जो पूर्ण निर्भरता के पेड़ के संस्करणों में ऊपर वर्णित ताले के रूप में वर्णित है। यह आपको अपने मानक पैकेज का उपयोग कर नए निर्भरता संस्करणों (प्रत्यक्ष या अप्रत्यक्ष) के परीक्षण की अनुमति देते हुए अन्य डेवलपर्स के लिए या रिलीज के लिए अपने निर्भरता के पेड़ की गारंटी देता है।

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


78
अगर निर्भरता का एक सटीक संस्करण है, तो इसकी मांग क्यों की जाती है, तो पैकेज में सटीक संस्करण को निर्दिष्ट करने के लिए क्यों नहीं लागू किया गया है।
जहाराली

15
@ जहाराली - ने आपके प्रश्न के आधार पर मेरे उत्तर में संशोधन किया है।
मैट

1
अन्य डेवलपर्स के लिए pacakge.json.lock से इस निर्भरता के पेड़ को कैसे प्राप्त किया जाता है? खुद ब खुद?
स्टेपवेक

40
कृपया ध्यान दें कि यह उत्तर अब सही नहीं है ! package-lock.jsonफ़ाइल अद्यतन किया जा रहा है हर बार आप स्थापित NPM फोन NPM 5.1 के बाद से। (में परिवर्तन github.com/npm/npm/issues/16866 , में उदाहरण github.com/npm/npm/issues/17979 ) इसलिए यह कर सकते हैं अब सभी डेवलपर्स के लिए एक ही संस्करण स्थापित करने के लिए इस्तेमाल किया जा , जब तक आप सटीक संस्करणों निर्दिष्ट की तरह 1.2.3की बजाय 1.2.*अपने में package.jsonफ़ाइल।
क्रिश्चियन

5
आप के लिए एक संदर्भ जोड़ना चाहिए npm ciके रूप में npm installci अपनी सामग्री का उपयोग करता है, जबकि पैकेज-lock.json अद्यतन करेगा। केवल साथ में npm ciही आपको लगातार मजबूत बिल्ड मिलेंगे।
k0pernikus

34

यह npm के लिए एक बहुत ही महत्वपूर्ण सुधार है: हर पैकेज के सटीक समान संस्करण की गारंटी

कैसे सुनिश्चित करें कि एक ही समय में अलग-अलग वातावरण में एक ही पैकेज के साथ निर्मित आपकी परियोजना? मान लीजिए, आप ^1.2.3अपने उपयोग में ला सकते हैं package.json, या आपके कुछ आश्रित इस तरह का उपयोग कर रहे हैं, लेकिन आप यह कैसे सुनिश्चित कर सकते हैं कि प्रत्येक बार npm installआपके देव मशीन और बिल्ड सर्वर में एक ही संस्करण उठाएगा? पैकेज- lock.json यह सुनिश्चित करेगा।

npm installबिल्ड सर्वर या परिनियोजन सर्वर पर, लॉक फ़ाइल को फिर से जेनरेट करेगा, npm ci(जो लॉक फाइल से पढ़ेगा, और पूरे पैकेज ट्री को स्थापित करेगा)


9
ध्यान दें कि यह अब पुराना है। 5.1.0 आगे की तरफ, "npm इंस्टॉल" package-lock.jsonफाइल से बिल्कुल भी नहीं पढ़ता है । यह उसी package.jsonतरह से स्थापित करता है जैसे यह उपयोग करता था। package-lock.jsonफ़ाइल का उपयोग करने के लिए , आपको नए "npm ci" कमांड का उपयोग करना होगा, जो package-lock.jsonकि दिए गए संस्करण-श्रेणियों के बजाय सूचीबद्ध सटीक संस्करणों को स्थापित करेगा package.json
वेनरिक्स

5
मुझे डर है कि वेनरिक्स गलत है। npm install करता से पढ़ा package-lock.json। पुन: पेश करने के लिए, निम्नलिखित करें। इस package.json का उपयोग करते हुए, npm install{... "devD dependencies": {"sinon": "7.2.2"}} को अब कॉपी / पेस्ट करें package.jsonऔर package-lock.jsonएक नई निर्देशिका में करें। इसमें परिवर्तन package.jsonकरें: "पापोन": "^ 7.2.2" रन npm install। npm पैकेज-लॉक.जसन से पढ़ता है और 7.3.0 के बजाय 7.2.2 स्थापित करता है। बिना पैकेज-लॉक.जॉन, 7.3.0 स्थापित किया जाएगा।
जुमाफ्रा

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

1
package.jsonऐसा कुछ सोचें, जिसे आप मैन्युअल रूप से संशोधित कर सकते हैं, और package-lock.jsonऐसी चीज़ के रूप में जिसे आप कभी भी मैन्युअल रूप से स्पर्श नहीं करते हैं। आप हमेशा BOTH फ़ाइलों को नियंत्रित करते हैं - विशेष रूप से package-lock.json। दोनों फ़ाइलों को खोलें, प्रोजेक्ट नाम को मैन्युअल रूप से संपादित करें package.json, चलाएं npm installऔर देखें कि प्रोजेक्ट का नाम कैसे बदलता है package-lock.jsonlicenseमें दर्ज नहीं लगता है package-lock.json
जुमाफ्रा

2
@ ज़ुमफ़्रा पैकेज-लॉक.जसन फ़ाइल का उपयोग करते समय किया जाएगा npm ci, npm installबस पैकेज का उपयोग करेगा। भले ही लॉक फ़ाइल प्रदान की गई हो,
शिन

13

package-lock.json"वर्जन" प्रॉपर्टी जैसे किसी प्रॉपर्टी में संख्यात्मक मान, या डिपेंडेंसी प्रॉपर्टी में बदल जाने पर लिखा जाता है package.json

यदि इन अंकीय मानों का मिलान package.jsonऔर package-lock.jsonमिलान किया जाता है, package-lock.jsonतो इससे पढ़ा जाता है।

अगर में इन संख्यात्मक मानों package.jsonऔर package-lock.jsonमेल नहीं खाते, package-lock.jsonइस तरह के कैरट और लहरिल के रूप में उन नए मूल्यों, और नए संशोधक के साथ करने के लिए लिखा है अगर वे मौजूद हैं। लेकिन यह वह अंक है जो परिवर्तन को ट्रिगर कर रहा है package-lock.json

यह देखने के लिए कि मेरा क्या मतलब है, निम्न कार्य करें। package.jsonबिना उपयोग करना package-lock.json, npm installसाथ चलाना :

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json अब होगा:

"sinon": {
  "version": "7.2.2",

अब दोनों फाइलों को एक नई डायरेक्टरी में कॉपी / पेस्ट करें। package.json(केवल केयरिंग जोड़ने) में बदलें :

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

दौड़ो npm install। यदि कोई package-lock.jsonफ़ाइल नहीं थी , तो sinon@7.3.0 इंस्टॉल किया जाएगा। npm installहै से पढ़ने package-lock.json और 7.2.2 स्थापित करने।

अब इसमें बदलें package.json:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

दौड़ो npm installpackage-lock.jsonके लिए लिखा गया है , और अब दिखाएगा:

"sinon": {
  "version": "^7.3.0",

7

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


4

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

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

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}


2

यह फ़ाइल स्वचालित रूप से आपके पैकेज प्रतिष्ठानों का ट्रैक रखने के लिए और आपकी परियोजना की निर्भरता के राज्य और इतिहास को बेहतर ढंग से प्रबंधित करने के लिए npm द्वारा बनाई और उपयोग की जाती है। आपको इस फ़ाइल की सामग्री को परिवर्तित नहीं करना चाहिए।


1
तो क्या होगा यदि मुझे इस फ़ाइल के साथ कोई विरोधाभास मिलता है?
ओलिवर वाटकिंस

0

package-lock.json: इसमें सटीक संस्करण विवरण हैं जो वर्तमान में आपके एप्लिकेशन के लिए इंस्टॉल किया गया है।


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