मैं कितनी परियोजनाओं को नोड_मॉडल निर्देशिका साझा कर सकता हूं?


95

जब भी मैं प्रोजेक्ट बनाता हूं, मुझे नोड मॉड्यूल की सभी निर्भरताएं डाउनलोड करनी होती हैं। नोड_मॉड्यूल्स की नकल के बिना, क्या केंद्रीय नोड_मॉडल को कई परियोजनाओं में साझा करना है?

फॉलोइंग की तरह, मुझे हर बार कई कमांड चलाने पड़ते हैं।

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
यदि आप एक हैं, तो आप उन्हें एक सामान्य, मूल निर्देशिका में स्थापित कर सकते हैं। नोड डी मॉड्यूल की खोज करने वाली निर्देशिकाओं कोrequire चलाएगा। अन्यथा, नहीं, node_modulesउपयोग के लिए एक आधिकारिक "केंद्रीय" फ़ोल्डर नहीं है require()
जोनाथन लोनोव्स्की

आप वैश्विक ध्वज का उपयोग करके इन पैकेजों को विश्व स्तर पर स्थापित कर सकते हैं। इसलिए आपको हर बार इंस्टॉल कमांड चलाने की आवश्यकता नहीं है। npm install <npm_package_name> -g
सबा हसन

जवाबों:


90

आप परियोजनाओं के बीच पूरी तरह से एक node_modules निर्देशिका साझा कर सकते हैं।

से नोड के प्रलेखन :

यदि मॉड्यूल पहचानकर्ता को पारित करने की आवश्यकता होती है () एक मूल मॉड्यूल नहीं है, और '/', '../, या' या ./ 'से शुरू नहीं होता है, तो नोड वर्तमान मॉड्यूल के मूल निर्देशिका में शुरू होता है, और जोड़ता है / node_modules, और उस स्थान से मॉड्यूल को लोड करने का प्रयास करता है।

यदि यह वहां नहीं पाया जाता है, तो यह मूल निर्देशिका में चला जाता है, और इसी तरह, जब तक कि फ़ाइल सिस्टम की जड़ तक नहीं पहुंच जाता।

उदाहरण के लिए, यदि '/home/ry/projects/foo.js' फ़ाइल को आवश्यकता ('bar.js') कहा जाता है, तो नोड इस क्रम में निम्नलिखित स्थानों में दिखेगा:

/home/ry/projects/node_modules/bar.js/home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

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

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

तो इस तरह, यहां तक ​​कि आपके उप-प्रोजेक्ट की निर्भरताएं आपके मुख्य नोड_मॉड्यूल रिपॉजिटरी पर आकर्षित कर सकती हैं।

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


3
इसे उत्तर के रूप में स्वीकार क्यों नहीं किया जाता है? @ टीपीई के आगे प्रश्न, क्या आपको सुझाए गए प्रोजेक्ट की तरह एक संरचना तैयार करनी चाहिए, कैसे एक पैकेज का निर्माण होगा। माता-पिता के रिपॉजिटरी से स्थापित करने के लिए पैकेज।
diehell

@ ऐसा लगता है कि यह "सभी या कुछ नहीं" है। यदि सभी या निर्भरताएं किसी मूल निर्देशिका में रहती हैं और CWD में कोई नोड_मॉड्यूल्स निर्देशिका नहीं है, तो npm माता-पिता की जाँच करेगा और यदि यह पाया जाता है तो वहां स्थापित कर देगा। यदि आप निर्देशिका में एक नोड_मॉडल फ़ोल्डर रखते हैं तो यह वहां स्थापित हो जाएगा।
tpie

4
मैं यह नहीं देखता कि कैसे साझा करने से नोड_मॉडल विभिन्न पैकेज संस्करणों को संभाल सकते हैं, नोड_मॉड्यूल्स में पैकेज को संस्करणबद्ध नहीं किया गया है, जैसे कि npm-cache के विपरीत c: \ Users (Windows), क्या किसी ने उस में चलाया?
साइबरबेस्ट

एनपीएम स्क्रिप्ट, और पैकेज.जॉन फाइलें लिखते समय मैं अपने प्रतिमान को कैसे संशोधित करूंगा?
मैडॉक्स

18

मुझे एक चाल मिली, बस विंडोज या लिनक्स पर सिम्बोलिक लिंक (सिम्बलिंक्स) पर एक नज़र डालें , यह शॉर्टकट की तरह ही काम कर रहा है लेकिन अधिक शक्तिशाली है।

बस आपको Junctionअपने node_modulesफ़ोल्डर के लिए कहीं भी अपनी आवश्यकता के अनुसार बनाने की आवश्यकता है । जंक्शन कुछ भी नहीं है, लेकिन आपके मूल नोड_मॉडल फ़ोल्डर के लिए एक छोटा कट है। इसे अपने प्रोजेक्ट फ़ोल्डर के अंदर बनाएँ जहाँ उपयोग किए जाने पर वास्तविक node_modules बनाए गए होंगे npm install

इसे प्राप्त करने के लिए आपको कम से कम एक node_modulesवास्तविक फ़ोल्डर की आवश्यकता होती है, फिर अन्य परियोजनाओं में इसे एक जंक्शन बनाएं।

विंडोज पर, आप या तो कमांड प्रॉम्प्ट का उपयोग कर सकते हैं, या किसी एप्लिकेशन का उपयोग कर सकते हैं। कमांड प्रॉम्प्ट का उपयोग करने से आपको थोड़ा अधिक नियंत्रण मिलता है, एप्लिकेशन का उपयोग करना आसान होता है, मैं सुझाव देता हूं लिंक शैल एक्सटेंशन


1
मैं dir को लक्षित करने के लिए cd, इस कमांड को चलाता हूं mklink /d node_modules (source dir)\node_modules:।
क्रिसटॉर्नग

1
मेरी टीम पिछले कुछ समय से इस पद्धति का उपयोग कर रही है। जबकि मैं वास्तव node_modulesमें परियोजना फ़ोल्डर में ही नहीं होने पर घृणा करता हूं , यह काम करता है। बस node_modulesकुछ भी नया स्थापित करने से पहले वास्तविक फ़ोल्डर में ब्राउज़ करना याद रखें : P
एंड्रयू Craswell

यह विधि मेरे लिए काम नहीं करती है। जब मैं प्रतीकात्मक या जंक्शनों का उपयोग करता हूं, तो मुझे नोड-एसएएस के साथ निम्नलिखित त्रुटि मिलती है: मॉड्यूल बिल्ड विफल रहा: "त्रुटि: मॉड्यूल ने स्वयं-पंजीकरण नहीं किया" और त्रुटि में आगे का विवरण निर्देशिका को निर्दिष्ट करता है जहां "साझा" नोड_मॉडल्स निर्देशिका मौजूद है। कोई विचार?
फ्लिपकोड

1
npm install"कनेक्टेड" ऐप्स में से किसी में चलने पर निर्भरता छंटनी से कैसे बचें ?
क्वर्टी

1
लेकिन जब मैं npm install <new-package>आपके मौजूदा प्रोजेक्ट के पैकेज में सभी पैकेज नहीं चलाता हूं । तो हटा दिए जाते हैं।
रोहित कौशल

17

Npm के बजाय pnpm का प्रयास करें ।

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

इसके साथ स्थापित करें:

npm install -g pnpm

अपनी मौजूदा स्थापनाओं (और उप-निर्देशिकाओं) का उपयोग करने के लिए:

pnpm recursive install

8

मुख्य निर्देशिका इस तरह दिखना चाहिए

node_modules
Project 1
Project 2
Project 3
Project 4

बस फ़ाइल खोलें Project 1/.angular-cli.json

स्कीमा बदलें

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

सेवा

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

और node_modulesअपने प्रोजेक्ट डायरेक्टरी के अंदर खाली फोल्डर बनाना न भूलें


आप मेरे हीरो हैं। मैंने इस पर एक सप्ताह बिताया है । बहुत बहुत धन्यवाद!!
एलीएजर बर्लिन

5

कुछ लेखों को देखकर ऐसा लगता है कि Lerna एक एकल निर्देशिका ( monorepo) के अंदर कई परियोजनाओं के प्रबंधन के लिए एक अच्छा उपकरण है । यह प्रत्येक फ़ोल्डर में पूरे पैकेज को डुप्लिकेट किए बिना मॉड्यूल साझाकरण का समर्थन करता है और उन्हें कई परियोजनाओं में स्थापित करने के लिए आदेश देता है।

pnpm भी एक सरल और कुशल उपकरण है, जो उन मॉड्यूल की नकल नहीं करता है जो पहले से ही अन्य परियोजनाओं के लिए स्थापित हैं।


0

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

मेरा विचार नीचे के रूप में एक एकल रूट और कई src स्तर का होगा

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

एकमात्र समस्या जो आपके सामने हो सकती है, वह किसी भी ऐप के लिए json (या tsconfig) का बैकअप हो सकती है और जब आप इस पर काम करते हैं और किसी ऐप को सेवा देने के लिए अपनी स्टार्टअप स्क्रिप्ट सेटअप करते हैं, तो उन्हें पुनर्स्थापित करें


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