मैं नोड में वैश्विक मॉड्यूल कैसे आयात करूं? मुझे "त्रुटि: मॉड्यूल <मॉड्यूल> नहीं मिल रहा है?"


145

मैं मैक OSX शेर पर नोड सेटअप करने की कोशिश कर रहा हूं। यह सब ठीक काम करने लगता है, लेकिन मैं अपने वैश्विक मॉड्यूल फ़ोल्डर से कुछ भी मॉड्यूल आयात नहीं कर सकता। मुझे त्रुटि मिलती है,

Error: Cannot find module <module>

यदि मैं इसे चलाता हूं: node -e require.pathsमुझे जो प्रतिक्रिया मिलती है वह है:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

जो सही है, मेरे मॉड्यूल वास्तव में / usr / स्थानीय / lib / node_modules में स्थापित हैं। जब मैं एक स्क्रिप्ट की कोशिश करता हूं और चलाता हूं, हालांकि, मुझे यह मिल रहा है:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

मेरा .bash_profile इस तरह दिखता है:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

वास्तव में कुछ मदद की सराहना करेंगे, मुझे पता नहीं क्यों मैं किसी भी पुस्तकालय आयात नहीं कर सकता।


1
आप जानते हैं कि यह चीजों को करने का पसंदीदा तरीका नहीं है, है ना?
18

1
क्या आप विस्तृत कर सकते हैं? क्या आपका मतलब है कि मुझे अपने वैश्विक फ़ोल्डर में लाइब्रेरी स्थापित नहीं करनी चाहिए?
हनपन

3
@ वानपन: पसंदीदा तरीका है उन मॉड्यूल को स्थापित करना जिन्हें आप स्थानीय स्तर पर आवश्यकता के माध्यम से उपयोग करना चाहते हैं।
thejh

1
एक बेहतर और अधिक अपडेटेड उत्तर (जिस पर भरोसा नहीं npm linkकिया जाता है) यहां
देखे

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

जवाबों:


116

यदि आप npm> = 1.0 का उपयोग कर रहे हैं, तो आप npm link <global-package>विश्व स्तर पर पहले से स्थापित पैकेज के लिए एक स्थानीय लिंक बनाने के लिए उपयोग कर सकते हैं । ( कैविएट: ओएस को सीमलिंक का समर्थन करना चाहिए। )

हालाँकि, यह इसकी समस्याओं के बिना नहीं आता है।

npm लिंक एक विकास उपकरण है। यह आपके स्थानीय विकास बॉक्स पर संकुल के प्रबंधन के लिए बहुत बढ़िया है । लेकिन npm लिंक के साथ तैनाती मूल रूप से समस्याओं के लिए पूछ रही है, क्योंकि यह चीजों को साकार किए बिना अपडेट करना सुपर आसान बनाता है।

एक विकल्प के रूप में, आप संकुल को स्थानीय स्तर पर और विश्व स्तर पर स्थापित कर सकते हैं।

अतिरिक्त जानकारी के लिए, देखें


69
मैं इसे पढ़ रहा हूं और अपनी आंखों पर विश्वास नहीं कर सकता। इसलिए यदि मैं व्यक्त करता हूं, तो एक्सप्रेस को स्थापित करता हूं, और फिर एक्सप्रेस के शीर्ष पर बनाने के लिए 20 परियोजनाएं हैं, मुझे इसे 20 बार स्थापित करने की आवश्यकता है, उनमें से प्रत्येक के लिए, प्रत्येक प्रोजेक्ट फ़ोल्डर में, बार-बार? मुझे पैकेज मैनेजर के साथ बहुत अनुभव नहीं है, लेकिन यह थोड़े बेकार है ...
treznik

25
यह सही है, और यदि आप इसके बारे में सोचते हैं, तो यह समझ में आता है। स्थानीय रूप से आपकी निर्भरता को प्रबंधित करने से सब कुछ स्व-निहित रहता है और आपको किसी भी परियोजना के लिए एक निर्भरता के विशिष्ट संस्करण को निर्दिष्ट करने की अनुमति मिलती है (जैसे परियोजना फू को एक्सप्रेस 2.x की आवश्यकता होती है, जबकि प्रोजेक्ट बार एक्सप्रेस 3 बीटा का उपयोग कर सकता है)।
गम्भीर

43
मैं कुछ समय के लिए इस तर्क को समझने के लिए संघर्ष करता रहा, लेकिन अपने रूबी दोस्तों को वैश्विक पैकेज अपडेट के साथ संघर्ष करने के बाद, जवाहरात के बारे में तर्क देता हूं और अक्सर बस कभी अपग्रेड नहीं करता, मैंने माना है कि स्थानीय स्तर पर निर्भरता स्थापित करना बिल्कुल एकमात्र तरीका है पैकेज प्रबंधन
तैमूल जूल

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

1
यह भी मेरी समझ है कि npmकैश (जिसमें रहता है ~/.npm) आपके विभिन्न स्थानों में की गई पुनर्स्थापना प्रक्रिया को तेज कर देगा।
स्टीवन लू

85

NODE_PATHमॉड्यूल खोज पथ में शामिल करने के लिए अतिरिक्त निर्देशिकाओं को निर्दिष्ट करने की अनुमति देने के लिए Node.js पर्यावरण चर का उपयोग करता है । आप npmखुद को यह बताने के लिए उपयोग कर सकते हैं कि वैश्विक मॉड्यूल कहां npm root -gकमांड के साथ संग्रहीत हैं । इसलिए उन दोनों को एक साथ रखकर, आप सुनिश्चित कर सकते हैं कि वैश्विक मॉड्यूल निम्नलिखित कमांड के साथ आपके खोज पथ में शामिल हैं (लिनक्स-ईश पर)

export NODE_PATH=$(npm root --quiet -g)


3
NODE_PATHपर्यावरण चर संकेत के लिए धन्यवाद । इससे बहुत मदद मिली!
रेकीर

7
यह शीर्ष टिप्पणी होनी चाहिए
एडम प्रिक्स

मुझे NODE_PATHMSYS2 पर npm काम करने के लिए बराबर पॉज़िक्स पथ पर सेट करना था । धन्यवाद।
जॉयस बाबू

विंडोज और जीआईटी बैश के साथ भी काम करता है। उत्तम। :-)
inf3rno

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

65

आप अपने प्रोजेक्ट फ़ोल्डर में अपने वैश्विक पैकेज के लिए एक प्रतीकात्मक लिंक बनाने के लिए npm लिंक का उपयोग कर सकते हैं।

उदाहरण:

$ npm install -g express
$ cd [local path]/project
$ npm link express

यह सब एक स्थानीय नोड_मॉडल फ़ोल्डर बनाता है और फिर एक सिमलिंक एक्सप्रेस बनाता है -> [वैश्विक निर्देशिका] / नोड_मॉड्यूल्स / एक्सप्रेस जिसे तब हल किया जा सकता है require('express')


क्या यह क्रॉस-ओएस संगत है?
UpTheCreek

Windows के नए संस्करणों इस संस्करण के बाद से यह समर्थन करते हैं: github.com/npm/npm/commit/... पुराने विंडोज संस्करणों के लिए कोशिश npmjs.com/package/npm-junction
एलेक्स

22

नीचे के रूप में किसी भी पैकेज को विश्व स्तर पर स्थापित करें:

$ npm install -g replace  // replace is one of the node module.

चूँकि यह प्रतिस्थापित मॉड्यूल विश्व स्तर पर स्थापित है, इसलिए यदि आप अपने नोड मॉड्यूल फ़ोल्डर को देखते हैं तो आप वहाँ प्रतिस्थापित मॉड्यूल नहीं देखेंगे और इसलिए आप आवश्यकता ('बदलें') का उपयोग करके इस पैकेज का उपयोग नहीं कर सकते।

क्योंकि आवश्यकता के साथ आप केवल स्थानीय मॉड्यूल का उपयोग कर सकते हैं जो आपके नोड मॉड्यूल फ़ोल्डर में मौजूद हैं।

अब वैश्विक मॉड्यूल का उपयोग करने के लिए आपको इसे कमांड के नीचे नोड मॉड्यूल पथ के साथ जोड़ना चाहिए।

$ npm link replace

अब वापस जाएं और अपने नोड मॉड्यूल फ़ोल्डर को देखें जो आप अब वहां मॉड्यूल को देखने में सक्षम हो सकते हैं और इसे अपने आवेदन में आवश्यकता ('बदलें') के साथ उपयोग कर सकते हैं क्योंकि यह आपके स्थानीय नोड मॉड्यूल के साथ जुड़ा हुआ है।

Pls मुझे बताएं कि क्या किसी और स्पष्टीकरण की आवश्यकता है।


14

आप तर्क के रूप में वैश्विक मॉड्यूल निर्देशिका के पथ के साथ आवश्यकता का उपयोग कर सकते हैं।

require('/path/to/global/node_modules/the_module');

अपने मैक पर, मैं इसका उपयोग करता हूं:

require('/usr/local/lib/node_modules/the_module');

कैसे पता करें कि आपके वैश्विक मॉड्यूल कहाँ हैं? -> npm संकुल कहाँ स्थापित होता है?


7

अपने वैश्विक को इंगित करने के लिए पर्यावरण चर NODE_PATH की स्थापना करना node_modules फ़ोल्डर ।

विंडोज 7 या उच्चतर पथ में कुछ ऐसा है %AppData%\npm\node_modulesजबकि UNIX में कुछ ऐसा हो सकता है/home/sg/.npm_global/lib/node_modules/ लेकिन यह उपयोगकर्ता कॉन्फ़िगरेशन पर निर्भर करता है।

आदेश npm config get prefix यह पता लगाने में मदद कर सकती है कि सही रास्ता कौन सा है।

UNIX सिस्टम में आप इसे निम्न कमांड के साथ पूरा कर सकते हैं:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

मैं डॉकर का उपयोग कर रहा हूं। मैं एक डॉक इमेज बनाने की कोशिश कर रहा हूं जिसमें मेरी सभी नोड निर्भरताएं स्थापित हैं, लेकिन कंटेनर रन टाइम (नोड_मॉडल्स निर्देशिका या लिंक के साथ इसे प्रदूषित किए बिना) में मेरी स्थानीय ऐप निर्देशिका का उपयोग कर सकते हैं। यह इस परिदृश्य में समस्याओं का कारण बनता है। मेरा वर्कअराउंड उस सटीक पथ की आवश्यकता है जहां मॉड्यूल, उदाहरण के लिए आवश्यक है ('/ usr / स्थानीय / lib / node_modules / socket.io')


-1

require.paths पदावनत किया गया है।

अपने प्रोजेक्ट फ़ोल्डर में जाएं और टाइप करें

npm install socket.io

इसे स्थानीय में स्थापित करना चाहिए ।/node_modules फ़ोल्डर जहां नोड इसके लिए दिखेगा।

मैं अपनी चीजें इस तरह से रखता हूं:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

एक app.js फ़ाइल बनाएँ

// app.js
var socket = require('socket.io')

अब मेरा ऐप चलाएं

node app.js

सुनिश्चित करें कि आप उपयोग कर रहे हैं npm >= 1.0और node >= 4.0


8
वह विश्व स्तर पर स्थापित npm संकुल के उपयोग के बारे में पूछ रहा है।
11

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