क्या "node_modules" फ़ोल्डर को गिट रिपॉजिटरी में शामिल किया जाना चाहिए


176

मैं सोच रहा था कि क्या हमें अपने रेपो में नोड_मॉडल्स पर नज़र रखनी चाहिए या कोड चेक करते समय एक एनपीएम इंस्टॉल करना चाहिए?


जवाबों:


177

इसका जवाब उतना आसान नहीं है जितना अल्बर्टो ज़ाकाग्नि सुझाव देते हैं। यदि आप एप्लिकेशन (विशेष रूप से एंटरप्राइज़ एप्लिकेशन) विकसित करते हैं, जिसमें आपके git रेपो में nod_modules शामिल है, एक व्यवहार्य विकल्प है और आप जो विकल्प चुनते हैं, वह आपकी परियोजना पर निर्भर करता है।

क्योंकि वह नोड_मॉडल्स के खिलाफ बहुत अच्छी तरह से तर्क देता था, मैं उनके लिए तर्कों पर ध्यान केंद्रित करूंगा।

कल्पना करें कि आपने अभी-अभी एंटरप्राइज़ ऐप पूरा किया है और आपको इसे 3-5 साल के लिए सपोर्ट करना होगा। आप निश्चित रूप से किसी के npm मॉड्यूल पर निर्भर नहीं होना चाहते हैं जो कल गायब हो सकता है और आप अपने ऐप को अब अपडेट नहीं कर सकते।

या आपके पास आपके निजी मॉड्यूल हैं जो इंटरनेट से सुलभ नहीं हैं और आप इंटरनेट पर अपना ऐप नहीं बना सकते हैं। या हो सकता है कि आप कुछ कारणों से npm सेवा पर अपने अंतिम निर्माण पर निर्भर नहीं होना चाहते।

आप इस Addy Osmani लेख में पेशेवरों और विपक्षों को पा सकते हैं (हालांकि यह बोवर के बारे में है, यह लगभग एक ही स्थिति है)। और मैं बोवर होमपेज और आदी के लेख के एक उद्धरण के साथ समाप्त होगा:

"यदि आप किसी ऐसे पैकेज को नहीं लिख रहे हैं जिसका उद्देश्य दूसरों द्वारा खपत किया जाना है (जैसे, आप एक वेब ऐप बना रहे हैं), तो आपको हमेशा स्थापित पैकेजों को स्रोत नियंत्रण में जांचना चाहिए।"


6
मैं इससे पूरी तरह सहमत हूं। मैं करने के लिए हमारे उद्यम का निर्माण प्रणाली नहीं करना चाहती की आवश्यकता होती है , क्योंकि यह निर्भरता है, जो डाउनलोड करने के लिए की जरूरत है एक इंटरनेट कनेक्शन की एक सफल बनाने के बनाने के लिए उम्मीद है कि अभी भी आसपास हैं। धन्यवाद।
डेडलीडॉग

9
@ अलबर्टो ज़क्काग्नी का मानना ​​है कि आप पहली बार सही थे। यदि आप वास्तव में एक एंटरप्राइज़ ऐप बना रहे हैं, तो आपको एंटरप्राइज़ टूल का उपयोग करना चाहिए। इंटरनेट से गायब होने वाली परियोजनाओं से सुरक्षा के लिए आर्टिफैक्ट और एनपीएम-आर्टिफैक्ट का उपयोग किया जाना चाहिए। यहां तक ​​कि छोटी परियोजनाओं पर भी स्रोत नियंत्रण में जाँच की गई एक ही चीज़ की कई प्रतियां होने से यह क्लीनर है।
टेड बीघम

10
बाद छोड़ दिया पैड मुद्दा , मुझे लगता है कि यह निश्चित रूप से एक बुरा विचार node_modules ट्रैक करने के लिए नहीं है।
लेओ लैम

6
महत्वपूर्ण पहलू दोपहर का उल्लेख किया। यदि आपका नोड_मॉड्यूल्स VCS के अंतर्गत आता है - शाखाएं बदलना बस है git checkout foo। यदि नोड_मॉड्यूल्स वीसीएस के तहत नहीं हैं - स्विचिंग शाखाएं हैं git checkout foo ; npm installऔर आपके वर्तमान एनपीएम संस्करण को जो भी काम करना है;)
इवान क्लेशिन

7
सबसे साफ उद्यम समाधान एक आंतरिक इंट्रानेट-सुलभ एनपीएम रिपॉजिटरी की मेजबानी करना होगा जिसमें आपके द्वारा उपयोग किए जाने वाले मॉड्यूल के सभी संस्करण हैं, और स्रोत कोड के साथ नोड_मॉड्यूल्स में जांच नहीं करते हैं। आपका बिल्ड सिस्टम आपके आंतरिक नोड रिपॉजिटरी को संदर्भित करेगा।
user2867288

104

मॉड्यूल विवरण संग्रहीत हैं packages.json, यह पर्याप्त है। चेकइन की कोई आवश्यकता नहीं है node_modules

लोग node_modulesमॉड्यूल की निर्भरता को लॉक करने के लिए संस्करण नियंत्रण में स्टोर करते थे, लेकिन npm सिक्रेटवैप के साथ जिसकी अब कोई आवश्यकता नहीं है।

इस बिंदु के लिए एक और औचित्य, जैसा कि @ChrisCM ने टिप्पणी में लिखा है:

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


10
सरल, और बिंदु +1 तक। यह भी ध्यान देने योग्य है कि कोई भी मॉड्यूल जिसमें देशी एक्सटेंशन शामिल हैं, आर्किटेक्चर आर्किटेक्चर के लिए काम नहीं करेगा, और इसे फिर से बनाने की आवश्यकता है। रेपो में उन्हें शामिल नहीं करने के लिए ठोस औचित्य प्रदान करना।
क्रिसकम

3
वास्तव में नहीं, यह उदाहरण के लिए एक प्रजनन देव वातावरण का उपयोग करने के लिए औचित्य है। इसके लिए केवल एक वास्तुकला पर काम करना चाहिए।
रॉबिन स्मिथ

20

मैं उदाहरण के लिए PhantomJS और नोड- sass जैसे संकुल के कारण नोड_मॉड्यूल में जाँच के खिलाफ सिफारिश करूँगा , जो वर्तमान प्रणाली के लिए उपयुक्त बाइनरी स्थापित करते हैं।

इसका मतलब यह है कि अगर एक देव npm installलिनक्स पर चलता है और नोड_मॉड्यूल्स में जांच करता है - यह विंडोज पर रेपो क्लोन करने वाले दूसरे देव के लिए काम नहीं करेगा।

टारबॉल में यह जांचना बेहतर है कि कौन से एनपीएम डाउनलोड डाउनलोड करते हैं और npm-shrinkwrap.jsonउन पर इंगित करते हैं। आप संकोचन का उपयोग करके इस प्रक्रिया को स्वचालित कर सकते हैं ।


लेकिन npm install --global shrinkpackउसके बाद खुद में कमी नहीं है, जिसके लिए अन्य पैकेजों की आवश्यकता होती है, जिसके बाद सिकुड़े हुए संकुल को स्थापित करना है? यह Addy की सलाह के खिलाफ जाता है।
danjah

क्या आप इस प्रश्न पर फिर से विचार कर सकते हैं? मैं आपको पूरी तरह से क्षमा नहीं करता।
जेमी मेसन

आप जो भी वर्णन करते हैं, उस पर निर्भरता के shrinkpackलिए आवश्यक है कि निर्माण पर निर्भरता स्थापित करें। इसलिए, बिल्ड टूल की स्थापना ही संस्करण नियंत्रण पर सभी बिल्ड निर्भरताएं सबमिट करने के खिलाफ तर्क की कमजोरी बन जाती है।
danjah 11

1
मुझे लगता है कि लॉक फाइलों में जाँच करना पर्याप्त है (पैकेज- lock.json; यार्न.लॉक) कम से कम TFM के अनुसार: docs.npmjs.com/files/package-lock.json
लक्षित करें।

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

7

यह विषय बहुत पुराना है, मैं देखता हूं। लेकिन npm के इको सिस्टम में बदली स्थिति के कारण मुझे यहाँ दिए गए तर्कों के लिए कुछ अद्यतन याद आ रहे हैं।

मैं हमेशा संस्करण नियंत्रण के तहत नोड_मॉड्यूल नहीं लगाने की सलाह दूंगा। स्वीकृत उत्तर के संदर्भ में सूचीबद्ध होने से ऐसा करने के लगभग सभी लाभ अभी तक बहुत पुराने हैं।

  1. प्रकाशित पैकेज npm रजिस्ट्री से निरस्त नहीं किए जा सकते हैं जो आसानी से अब और नहीं। इसलिए आपको अपनी परियोजना पर निर्भर होने वाली निर्भरता खोने से डरने की जरूरत नहीं है।

  2. VCS में पैकेज- json.lock फ़ाइल डालना अक्सर अद्यतन की गई निर्भरता के साथ मदद कर रहा है, जिसके परिणामस्वरूप एक ही पैकेज पर निर्भर होने के बावजूद अलग-अलग सेटअप होते हैं।

इसलिए, ऑफ़लाइन बिल्ड टूल होने के मामले में VCS में नोड_मॉड्यूल्स डालना केवल योग्य उपयोग का मामला माना जा सकता है। हालांकि, नोड_मॉड्यूल आमतौर पर बहुत तेजी से बढ़ता है। किसी भी अपडेट से बहुत सारी फाइलें बदल जाएंगी। और यह विभिन्न तरीकों से रिपॉजिटरी को प्रभावित कर रहा है। यदि आप वास्तव में दीर्घकालिक प्रभाव पर विचार करते हैं जो एक बाधा भी हो सकती है।

Svn की तरह केंद्रीकृत वीसीएस 'को नेटवर्क पर प्रतिबद्ध और जाँच की गई फ़ाइलों को स्थानांतरित करने की आवश्यकता होती है जो कि एक नोड_मॉडल फ़ोल्डर को चेक करने या अपडेट करने के दौरान नरक के रूप में धीमा होने वाला है।

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

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


6

node_modulesस्रोत नियंत्रण के साथ ट्रैकिंग नहीं करना सही विकल्प है क्योंकि कुछ NodeJS मॉड्यूल, जैसे MongoDB NodeJS ड्राइवर, NodeJS C ++ ऐड-ऑन का उपयोग करते हैं। ये एड-ऑन npm installकमांड चलाते समय संकलित किए जाते हैं । इसलिए जब आप node_modulesनिर्देशिका को ट्रैक करते हैं , तो आप गलती से एक ओएस विशिष्ट बाइनरी फ़ाइल कर सकते हैं।


3

मैं 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


1
"नोड_मॉडल फ़ोल्डर प्रकाशित करना" का एक और नुकसान हो सकता है: npm installविंडोज और मैकओएस पर कॉल करने से कुछ पैकेजों में अलग-अलग फाइलें (ओएस-निर्भर फाइलें) उत्पन्न हो सकती हैं। लेकिन मुझे इस पर यकीन नहीं है। क्या कोई यह सत्यापित कर सकता है कि यह सच है?
ndsvw

2
"परिदृश्य 2": यही कारण है कि आप प्रतिबद्ध हैं package-lock.json। यदि स्टडपिड-पैकेज के अपडेट के साथ भविष्य में कोई समस्या है, तो आप उस सटीक संस्करण का पता लगाने के लिए लॉक फ़ाइल को वापस रोल कर सकते हैं, जिसने आपके लिए काम किया था।
टूलमेकरसेव

2

मैं सड़क के बीच के विकल्प की पेशकश करना चाहूंगा।

  1. node_modulesGit में न जोड़ें ।
  2. package-lock.jsonअपने निर्भरता संस्करणों को बंद करने के लिए एक फ़ाइल का उपयोग करें ।
  3. अपनी CI या रिलीज़ प्रक्रिया में, जब आप कोई संस्करण जारी करते हैं, तो नोड_मॉडल फ़ोल्डर की एक प्रतिलिपि बनाते हैं और इसे बैक अप करते हैं (जैसे क्लाउड स्टोरेज में)।

दुर्लभ घटना में कि आप एनपीएम (या आपके द्वारा उपयोग की जाने वाली अन्य रजिस्ट्रियां) या एनपीएम में एक विशिष्ट पैकेज का उपयोग नहीं कर सकते हैं, आपके पास नोड_मॉड्यूल्स की एक प्रति है और जब तक आप पहुंच बहाल नहीं करते हैं तब तक काम कर सकते हैं।


0

एक और बात पर विचार करना: में जाँच node_modulesकठिन बनाता है / असंभव के बीच अंतर का उपयोग करने dependenciesऔर devDependencies

दूसरी ओर, हालांकि, कोई कह सकता है कि यह उसी कोड का उत्पादन करने के लिए पुश करने के लिए आश्वस्त है जो परीक्षणों के माध्यम से चला गया - इतना सहित devDependencies


"ठीक उसी कोड का उत्पादन करने के लिए जो परीक्षणों के माध्यम से चला गया": यही वह है जिसके लिए आपके पास डॉकर है। या rpm की तरह एक ओएस पैकेज मैनेजर। आप परीक्षण और ठेस के बीच कोड का पुनर्निर्माण नहीं करते हैं, क्या आप? भक्ति पर निर्भरता ने अंतिम कोड बनाने में मदद की, लेकिन न तो तैनाती में कोई जगह है, न परीक्षण में और न ही ठेस में।
प्रति विकलैंडर

अगर यह निर्भरता अपने स्वयं के पैकेज में थी तो क्या यह मदद करेगा। "src" निर्देशिका की तुलना में एक निर्देशिका अधिक है? चूंकि नोड मॉड्यूल को वर्तमान निर्देशिका में शुरू करने और फिर ऊपर जाने के लिए खोजा जाता है, इसलिए आपको अभी भी अपने देव निर्भरता का उपयोग करना चाहिए और देव / src मॉड्यूल का पृथक्करण होना चाहिए।
एलेक्स

0

नोड_मॉड्यूल की जाँच करने की आवश्यकता नहीं है-यदि पैकेज में निर्भरता का उल्लेख किया गया है। कोई भी अन्य प्रोग्रामर बस इसे npm इंस्टॉल करके प्राप्त कर सकता है और npm प्रोजेक्ट के लिए कार्यशील निर्देशिका में आप नोड_मॉड्यूल बनाने के लिए पर्याप्त स्मार्ट है।

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