जवाबों:
इसका जवाब उतना आसान नहीं है जितना अल्बर्टो ज़ाकाग्नि सुझाव देते हैं। यदि आप एप्लिकेशन (विशेष रूप से एंटरप्राइज़ एप्लिकेशन) विकसित करते हैं, जिसमें आपके git रेपो में nod_modules शामिल है, एक व्यवहार्य विकल्प है और आप जो विकल्प चुनते हैं, वह आपकी परियोजना पर निर्भर करता है।
क्योंकि वह नोड_मॉडल्स के खिलाफ बहुत अच्छी तरह से तर्क देता था, मैं उनके लिए तर्कों पर ध्यान केंद्रित करूंगा।
कल्पना करें कि आपने अभी-अभी एंटरप्राइज़ ऐप पूरा किया है और आपको इसे 3-5 साल के लिए सपोर्ट करना होगा। आप निश्चित रूप से किसी के npm मॉड्यूल पर निर्भर नहीं होना चाहते हैं जो कल गायब हो सकता है और आप अपने ऐप को अब अपडेट नहीं कर सकते।
या आपके पास आपके निजी मॉड्यूल हैं जो इंटरनेट से सुलभ नहीं हैं और आप इंटरनेट पर अपना ऐप नहीं बना सकते हैं। या हो सकता है कि आप कुछ कारणों से npm सेवा पर अपने अंतिम निर्माण पर निर्भर नहीं होना चाहते।
आप इस Addy Osmani लेख में पेशेवरों और विपक्षों को पा सकते हैं (हालांकि यह बोवर के बारे में है, यह लगभग एक ही स्थिति है)। और मैं बोवर होमपेज और आदी के लेख के एक उद्धरण के साथ समाप्त होगा:
"यदि आप किसी ऐसे पैकेज को नहीं लिख रहे हैं जिसका उद्देश्य दूसरों द्वारा खपत किया जाना है (जैसे, आप एक वेब ऐप बना रहे हैं), तो आपको हमेशा स्थापित पैकेजों को स्रोत नियंत्रण में जांचना चाहिए।"
git checkout foo
। यदि नोड_मॉड्यूल्स वीसीएस के तहत नहीं हैं - स्विचिंग शाखाएं हैं git checkout foo ; npm install
और आपके वर्तमान एनपीएम संस्करण को जो भी काम करना है;)
मॉड्यूल विवरण संग्रहीत हैं packages.json
, यह पर्याप्त है। चेकइन की कोई आवश्यकता नहीं है node_modules
।
लोग node_modules
मॉड्यूल की निर्भरता को लॉक करने के लिए संस्करण नियंत्रण में स्टोर करते थे, लेकिन npm सिक्रेटवैप के साथ जिसकी अब कोई आवश्यकता नहीं है।
इस बिंदु के लिए एक और औचित्य, जैसा कि @ChrisCM ने टिप्पणी में लिखा है:
यह भी ध्यान देने योग्य है कि कोई भी मॉड्यूल जिसमें देशी एक्सटेंशन शामिल हैं, आर्किटेक्चर आर्किटेक्चर के लिए काम नहीं करेगा, और इसे फिर से बनाने की आवश्यकता है। रेपो में उन्हें शामिल नहीं करने के लिए ठोस औचित्य प्रदान करना।
मैं उदाहरण के लिए PhantomJS और नोड- sass जैसे संकुल के कारण नोड_मॉड्यूल में जाँच के खिलाफ सिफारिश करूँगा , जो वर्तमान प्रणाली के लिए उपयुक्त बाइनरी स्थापित करते हैं।
इसका मतलब यह है कि अगर एक देव npm install
लिनक्स पर चलता है और नोड_मॉड्यूल्स में जांच करता है - यह विंडोज पर रेपो क्लोन करने वाले दूसरे देव के लिए काम नहीं करेगा।
टारबॉल में यह जांचना बेहतर है कि कौन से एनपीएम डाउनलोड डाउनलोड करते हैं और npm-shrinkwrap.json
उन पर इंगित करते हैं। आप संकोचन का उपयोग करके इस प्रक्रिया को स्वचालित कर सकते हैं ।
npm install --global shrinkpack
उसके बाद खुद में कमी नहीं है, जिसके लिए अन्य पैकेजों की आवश्यकता होती है, जिसके बाद सिकुड़े हुए संकुल को स्थापित करना है? यह Addy की सलाह के खिलाफ जाता है।
shrinkpack
लिए आवश्यक है कि निर्माण पर निर्भरता स्थापित करें। इसलिए, बिल्ड टूल की स्थापना ही संस्करण नियंत्रण पर सभी बिल्ड निर्भरताएं सबमिट करने के खिलाफ तर्क की कमजोरी बन जाती है।
यह विषय बहुत पुराना है, मैं देखता हूं। लेकिन npm के इको सिस्टम में बदली स्थिति के कारण मुझे यहाँ दिए गए तर्कों के लिए कुछ अद्यतन याद आ रहे हैं।
मैं हमेशा संस्करण नियंत्रण के तहत नोड_मॉड्यूल नहीं लगाने की सलाह दूंगा। स्वीकृत उत्तर के संदर्भ में सूचीबद्ध होने से ऐसा करने के लगभग सभी लाभ अभी तक बहुत पुराने हैं।
प्रकाशित पैकेज npm रजिस्ट्री से निरस्त नहीं किए जा सकते हैं जो आसानी से अब और नहीं। इसलिए आपको अपनी परियोजना पर निर्भर होने वाली निर्भरता खोने से डरने की जरूरत नहीं है।
VCS में पैकेज- json.lock फ़ाइल डालना अक्सर अद्यतन की गई निर्भरता के साथ मदद कर रहा है, जिसके परिणामस्वरूप एक ही पैकेज पर निर्भर होने के बावजूद अलग-अलग सेटअप होते हैं।
इसलिए, ऑफ़लाइन बिल्ड टूल होने के मामले में VCS में नोड_मॉड्यूल्स डालना केवल योग्य उपयोग का मामला माना जा सकता है। हालांकि, नोड_मॉड्यूल आमतौर पर बहुत तेजी से बढ़ता है। किसी भी अपडेट से बहुत सारी फाइलें बदल जाएंगी। और यह विभिन्न तरीकों से रिपॉजिटरी को प्रभावित कर रहा है। यदि आप वास्तव में दीर्घकालिक प्रभाव पर विचार करते हैं जो एक बाधा भी हो सकती है।
Svn की तरह केंद्रीकृत वीसीएस 'को नेटवर्क पर प्रतिबद्ध और जाँच की गई फ़ाइलों को स्थानांतरित करने की आवश्यकता होती है जो कि एक नोड_मॉडल फ़ोल्डर को चेक करने या अपडेट करने के दौरान नरक के रूप में धीमा होने वाला है।
जब यह अतिरिक्त फ़ाइलों की इस उच्च संख्या को प्राप्त करने की बात आती है, तो तुरंत भंडार को प्रदूषित कर देगा। ध्यान रखें कि git किसी भी फ़ाइल के संस्करणों के बीच अंतर को ट्रैक नहीं कर रहा है, लेकिन जैसे ही किसी एकल वर्ण में परिवर्तन हुआ है, किसी फ़ाइल के किसी भी संस्करण की प्रतियां संग्रहीत की जा रही हैं। किसी भी निर्भरता के लिए हर अपडेट एक और बड़े बदलाव का परिणाम होगा। बैकअप और रिमोट सिंक्रोनाइज़ेशन को प्रभावित करने के कारण आपकी गिट रिपॉजिटरी जल्दी बड़ी हो जाएगी। यदि आप नोड रिपॉजिटरी से नोड_मॉड्यूल्स को बाद में हटाने का निर्णय लेते हैं तो यह अभी भी ऐतिहासिक कारणों से इसका हिस्सा है। यदि आपने अपने git रिपॉजिटरी को कुछ रिमोट सर्वर (जैसे बैकअप के लिए) में वितरित किया है, तो इसे साफ करना एक और दर्दनाक और त्रुटि वाला कार्य है जिसे आप चालू करेंगे।
इस प्रकार, यदि आप कुशल प्रक्रियाओं की देखभाल करते हैं और चीजों को "छोटा" रखना पसंद करते हैं, तो मैं अलग-अलग कलाकृतियों के भंडार का उपयोग करूंगा जैसे कि Nexos Repository (या ज़िप संग्रह के साथ बस कुछ HTTP सर्वर) डाउनलोड के लिए निर्भरता के कुछ पहले से निर्धारित सेट प्रदान करते हैं।
node_modules
स्रोत नियंत्रण के साथ ट्रैकिंग नहीं करना सही विकल्प है क्योंकि कुछ NodeJS मॉड्यूल, जैसे MongoDB NodeJS ड्राइवर, NodeJS C ++ ऐड-ऑन का उपयोग करते हैं। ये एड-ऑन npm install
कमांड चलाते समय संकलित किए जाते हैं । इसलिए जब आप node_modules
निर्देशिका को ट्रैक करते हैं , तो आप गलती से एक ओएस विशिष्ट बाइनरी फ़ाइल कर सकते हैं।
मैं ivoszz से सहमत हूं कि कभी-कभी नोड_मॉडल फ़ोल्डर की जांच करना उपयोगी होता है, लेकिन ...
दृष्टांत 1:
एक परिदृश्य: आप एक पैकेज का उपयोग करते हैं जो npm से हटा दिया जाता है। यदि आपके पास फ़ोल्डर के सभी मॉड्यूल नोड_मॉड्यूल हैं, तो यह आपके लिए कोई समस्या नहीं होगी। यदि आपके पास पैकेज में केवल पैकेज का नाम है। Json, तो आप इसे अब और नहीं प्राप्त कर सकते हैं। यदि कोई पैकेज 24 घंटे से कम पुराना है, तो आप इसे आसानी से npm से हटा सकते हैं। यदि यह 24 घंटे से अधिक पुराना है, तो आपको उनसे संपर्क करने की आवश्यकता है। परंतु:
यदि आप समर्थन से संपर्क करते हैं, तो वे यह देखने के लिए जांच करेंगे कि क्या आपके पैकेज के उस संस्करण को हटाने से कोई अन्य इंस्टॉल टूट जाएगा। यदि हां, तो हम इसे नहीं हटाएंगे।
तो इसके लिए संभावना कम है, लेकिन परिदृश्य 2 है ...
परिदृश्य 2:
एक अन्य परिदृश्य जहां यह मामला है: आप अपने सॉफ़्टवेयर या बहुत महत्वपूर्ण सॉफ़्टवेयर का एंटरप्राइज़ संस्करण विकसित करते हैं और अपने पैकेज में लिखते हैं।
"dependencies": {
"studpid-package": "~1.0.1"
}
आप function1(x)
उस पैकेज की विधि का उपयोग करें ।
अब स्टडपिड-पैकेज के डेवलपर्स का नाम बदल function1(x)
जाता है function2(x)
और वे गलती करते हैं ... वे अपने पैकेज के संस्करण को से बदल 1.0.1
देते हैं 1.1.0
। यह एक समस्या है क्योंकि जब आप npm install
अगली बार कॉल करते हैं, तो आप संस्करण को स्वीकार करेंगे 1.1.0
क्योंकि आपने टिल्ड ( "studpid-package": "~1.0.1"
) का उपयोग किया था ।
कॉल करने से function1(x)
अब त्रुटियां और समस्याएं हो सकती हैं।
परंतु:
पूरे रिपॉजिटरी में (प्रायः 100 एमबी से अधिक) पूरे नोड_मॉडल फोल्डर को पुश करने पर, आपको मेमोरी स्पेस खर्च करना होगा। सैकड़ों MB (package.json & node_modules) के साथ तुलना में कुछ kb (package.json) ... इसके बारे में सोचें।
आप इसे कर सकते हैं / इसके बारे में सोचना चाहिए अगर:
सॉफ्टवेयर बहुत महत्वपूर्ण है।
जब कुछ विफल हो जाता है तो यह आपके पैसे खर्च करता है।
आपको npm रजिस्ट्री पर भरोसा नहीं है। npm केंद्रीकृत है और सैद्धांतिक रूप से बंद हो सकता है।
आपको निम्नांकित मामलों में 99.9% में नोड_मॉडल फ़ोल्डर प्रकाशित करने की आवश्यकता नहीं है :
आप सिर्फ अपने लिए एक सॉफ्टवेयर विकसित करते हैं।
आपने कुछ प्रोग्राम किया है और केवल GitHub पर परिणाम प्रकाशित करना चाहते हैं क्योंकि कोई अन्य व्यक्ति शायद इसमें दिलचस्पी ले सकता है।
यदि आप नहीं चाहते हैं कि नोड_मॉड्यूल आपके भंडार में हों, तो बस एक .gitignore
फ़ाइल बनाएं और लाइन जोड़ें node_modules
।
npm install
विंडोज और मैकओएस पर कॉल करने से कुछ पैकेजों में अलग-अलग फाइलें (ओएस-निर्भर फाइलें) उत्पन्न हो सकती हैं। लेकिन मुझे इस पर यकीन नहीं है। क्या कोई यह सत्यापित कर सकता है कि यह सच है?
package-lock.json
। यदि स्टडपिड-पैकेज के अपडेट के साथ भविष्य में कोई समस्या है, तो आप उस सटीक संस्करण का पता लगाने के लिए लॉक फ़ाइल को वापस रोल कर सकते हैं, जिसने आपके लिए काम किया था।
मैं सड़क के बीच के विकल्प की पेशकश करना चाहूंगा।
node_modules
Git में न जोड़ें ।package-lock.json
अपने निर्भरता संस्करणों को बंद करने के लिए एक फ़ाइल का उपयोग करें ।दुर्लभ घटना में कि आप एनपीएम (या आपके द्वारा उपयोग की जाने वाली अन्य रजिस्ट्रियां) या एनपीएम में एक विशिष्ट पैकेज का उपयोग नहीं कर सकते हैं, आपके पास नोड_मॉड्यूल्स की एक प्रति है और जब तक आप पहुंच बहाल नहीं करते हैं तब तक काम कर सकते हैं।
एक और बात पर विचार करना: में जाँच node_modules
कठिन बनाता है / असंभव के बीच अंतर का उपयोग करने dependencies
और devDependencies
।
दूसरी ओर, हालांकि, कोई कह सकता है कि यह उसी कोड का उत्पादन करने के लिए पुश करने के लिए आश्वस्त है जो परीक्षणों के माध्यम से चला गया - इतना सहित devDependencies
।