NodeJS को एक वैश्विक मॉड्यूल / पैकेज की आवश्यकता होती है


159

मैं विश्व स्तर पर स्थापित करने के लिए और उसके बाद का उपयोग कोशिश कर रहा हूँ foreverऔर forever-monitorइस तरह:

npm install -g forever forever-monitor

मैं सामान्य आउटपुट देखता हूं और संचालन भी करता हूं जो फाइलों को वैश्विक पथ पर कॉपी करता है, लेकिन फिर अगर मैं कोशिश करता require("forever");हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि मॉड्यूल नहीं मिला।

मैं नोड और एनपीएम दोनों के नवीनतम संस्करण का उपयोग कर रहा हूं और मैं पहले से ही उस बदलाव के बारे में जानता हूं जो npm वैश्विक बनाम स्थानीय इंस्टॉल में किया गया है, लेकिन मैं वास्तव में हर प्रोजेक्ट पर स्थानीयता स्थापित नहीं करना चाहता हूं और मैं एक प्लेटफॉर्म पर काम कर रहा हूं जो doesn 'टी समर्थन linkतो npm linkएक वैश्विक इंस्टॉल करने के बाद मेरे लिए संभव नहीं है।

मेरा सवाल है: मुझे विश्व स्तर पर स्थापित पैकेज की आवश्यकता क्यों नहीं हो सकती है? यह एक सुविधा या एक बग है? या मुझ से कुछ गलत हो रहा है?

पुनश्च: बस इसे स्पष्ट करने के लिए क्रिस्टल: मैं स्थानीय रूप से स्थापित नहीं करना चाहता।




इसलिए यह ~/.config/yarn/globalयार्न के लिए है
लोकलहोस्टेडदेव

जवाबों:


215

Node.js में, आवश्यकता उस फ़ोल्डर में नहीं दिखती है जहाँ वैश्विक मॉड्यूल स्थापित हैं।

आप इसे NODE_PATH परिवेश चर सेट करके ठीक कर सकते हैं। लिनक्स में यह होगा:

export NODE_PATH=/usr/lib/node_modules

नोट: यह इस बात पर निर्भर करता है कि आपके वैश्विक मॉड्यूल वास्तव में कहां स्थापित हैं।

देखें: वैश्विक फ़ोल्डरों से लोड हो रहा है


24
मेरे Ubuntu 13.10 मशीन पर, मॉड्यूल के लिए वैश्विक पथ आपके द्वारा यहां दिखाए जाने से अलग है। मुझे export NODE_PATH=/usr/local/lib/node_modulesइसके बजाय उपयोग करना था।
ड्रू नोक

11
यदि आप विंडोज 7/8 पर हैं और किसी भी नोड के स्थापित डिफॉल्ट्स को ओवरराइड नहीं किया है, तो काम NODE_PATHकरने C:\Users\{USERNAME}\AppData\Roaming\npm\node_modulesकी संभावना के लिए पर्यावरण चर को सेट करना होगा।
वेस जॉनसन

5
@WesJohnson बस %AppData%\npm\node_modulesविंडोज 10. पर काम करेगी
-blang

6
यदि मैं सेट करूं तो क्या मैं NODE_PATHएक साथ वैश्विक और स्थानीय मॉड्यूल का उपयोग कर सकता हूं?
पाउलो ओलिवेरा

6
वैकल्पिक रूप से एक स्थिर पथ के बजाय, यानी यदि आप NVM का उपयोग कर रहे हैं:NODE_PATH=$(npm root -g)
holmberd

96

वैश्विक स्तर पर पैकेज स्थापित करने के बाद आपको स्थानीय प्रोजेक्ट को वैश्विक पैकेज से जोड़ना होगा

npm install express -g
cd ~/mynodeproject/
npm link express  

यहाँ देखें


2
मैं एक प्लेटफ़ॉर्म पर चल रहा हूं जो लिंक का समर्थन नहीं करता (जैसा कि मेरा प्रश्न बताता है) blog.nodejs.org/2011/04/06/npm-1-0-link
alexandernst

1
आप किस मंच का उपयोग कर रहे हैं?
user568109

1
मैं वास्तव में लिंक के साथ गड़बड़ नहीं करना चाहता (और न ही प्रतीकात्मक लिंक)। मैं सिर्फ विश्व स्तर पर पैकेज स्थापित करना चाहता हूं और उनकी आवश्यकता है। मुझे पता है कि एनपीएम को इससे बचने के लिए फिर से डिजाइन किया गया था, लेकिन इस तरह से कुछ हासिल करना कितना कठिन हो सकता है?
अलेक्जेंडर्स्ट

13
अगर मेरे पास कोई प्रोजेक्ट नहीं है तो क्या होगा? कहते हैं ~/some-stand-alone-random-nodejs-test.js। मैं अपने होम फोल्डर को प्रोजेक्ट डायरेक्टरी में नहीं बदलना चाहता। मैं हर छोटे प्रयोग के लिए नए फ़ोल्डर नहीं बनाना चाहता।
अन्नपूर्णे

1
विंडोज 8.1 पर एकदम सही काम किया। नोड कमांड लाइन cd से लेकर मेरी परियोजनाओं के स्थानीय नोड_मॉडल फ़ोल्डर तक निष्पादित किए गए npm link <module>तब आपको अपनी परियोजनाओं के नोड_मॉडल फ़ोल्डर में बनाया गया एक शॉर्टकट (लिंक) दिखाई देगा जो वैश्विक नोड मॉड्यूल को संदर्भित करेगा।
डायनामलिनक

26

नेक्रोमेंसी के लिए माफी लेकिन मैं विश्व स्तर पर स्थापित मॉड्यूल के लिए हार्ड-कोडेड पथ निर्दिष्ट करने में सक्षम हूं:

var pg = require("/usr/local/lib/node_modules/pg");

यह सही नहीं है, लेकिन यह देखते हुए कि यूनिटी 3 डी सभी जावास्क्रिप्ट को "संकलन" करने की कोशिश करता है जो परियोजना निर्देशिका में शामिल है, मैं वास्तव में किसी भी पैकेज को स्थापित नहीं कर सकता।


4
Unity3D जावास्क्रिप्ट का समर्थन नहीं करता है। यह अपने Boo दुभाषिया / संकलक के लिए JS-like सिंटैक्स का समर्थन करता है (बू .NET के लिए पायथन जैसी भाषा है) जिसे भ्रामक रूप से "जावास्क्रिप्ट" के रूप में विपणन किया जाता है । Unity का समर्थन करने वाली भाषा के लिए अधिक सटीक नाम UnityScript है । क्योंकि यह एक ही भाषा के करीब भी नहीं है, वेब के लिए या Node.js के लिए लिखे गए JS में से कोई भी एकता में काम नहीं करेगा। आधिकारिक यूनिटी विकी पर मतभेदों के बारे में अधिक जानकारी: wiki.unity3d.com/index.php/UnityScript_versus_JavaScript
स्लिप डी। थॉम्पसन

19

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसमें तब भाग गया जब semverकिसी preinstallस्क्रिप्ट में किसी संस्करण का उपयोग करके जाँच करने की कोशिश की गई package.json। चूंकि मुझे पता था कि मैं स्थापित किसी भी स्थानीय मॉड्यूल पर निर्भर नहीं हो सकता, मैंने इसका उपयोग semverवैश्विक node_modulesफ़ोल्डर से करने की आवश्यकता के रूप में किया (जैसा npmकि मैं जानता हूं कि यह वहां पर निर्भर करता है:)

function requireGlobal(packageName) {
  var childProcess = require('child_process');
  var path = require('path');
  var fs = require('fs');

  var globalNodeModules = childProcess.execSync('npm root -g').toString().trim();
  var packageDir = path.join(globalNodeModules, packageName);
  if (!fs.existsSync(packageDir))
    packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm

  if (!fs.existsSync(packageDir))
    throw new Error('Cannot find global module \'' + packageName + '\'');

  var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString());
  var main = path.join(packageDir, packageMeta.main);

  return require(main);
}

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

मैं किसी ऐसे NODE_PATHसमाधान के साथ नहीं गया था, जैसा कि मैंने सुझाव दिया है कि जब से मैं npm installअपनी परियोजना के लिए चलने से पहले अतिरिक्त कॉन्फ़िगरेशन / सेटअप की आवश्यकता के बिना किसी की मशीन पर काम करना चाहता हूं।

जिस तरह से इसे कोडित किया गया है, यह केवल शीर्ष-स्तरीय मॉड्यूल (उपयोग करके स्थापित npm install -g ...) या इसके लिए आवश्यक मॉड्यूल npm( dependenciesयहां सूचीबद्ध : https://github.com/npm/npm/blob/master/package.json ) खोजने की गारंटी है । यदि आप एनपीएम के एक नए संस्करण का उपयोग कर रहे हैं, तो यह अन्य विश्व स्तर पर स्थापित पैकेजों की निर्भरता पा सकता है क्योंकि इसके लिए एक चापलूसी संरचना हैnode_modules अब फ़ोल्डर्स के ।

आशा है कि यह किसी के लिए उपयोगी है।


19

प्रलेखन के अनुसार , Node.js डिफ़ॉल्ट रूप से निम्नलिखित स्थानों में खोज करेंगे:

  1. NODE_PATHपर्यावरण चर में निर्दिष्ट पथ

    नोट: NODE_PATHपर्यावरण चर निरपेक्ष पथों की एक बृहदान्त्र-सीमांकित सूची में सेट है।

  2. वर्तमान node_modulesफ़ोल्डर। (स्थानीय)

  3. $HOME/.node_modules (वैश्विक)

    नोट: $HOMEउपयोगकर्ता की होम डायरेक्टरी है।

  4. $HOME/.node_libraries (वैश्विक)
  5. $PREFIX/lib/node (वैश्विक)

    नोट: $PREFIXNode.js का कॉन्फ़िगर हैnode_prefix

    के वर्तमान मूल्य की जांच करने के लिए node_prefix, चलाएं:

    node -p process.config.variables.node_prefix

    नोट: उपसर्ग --prefixबिल्ड के दौरान परम से मेल खाता है और इसके सापेक्ष है process.execPathnpm config get prefixकमांड से मूल्य के साथ भ्रमित करने के लिए नहीं । स्रोत

यदि दिए गए मॉड्यूल को नहीं पाया जा सकता है, तो इसका मतलब है कि यह उपरोक्त स्थानों में से एक में मौजूद नहीं है।

वैश्विक रूट फ़ोल्डर का स्थान जहां मॉड्यूल स्थापित हैं, द्वारा मुद्रित किया जा सकता है: npm root -g(डिफ़ॉल्ट रूप से पथ को रन-टाइम पर गणना की जाती है जब तक कि फ़ाइल में ओवरराइड नहीं किया जाता npmrcहै )।

उपाय

आप निम्नलिखित वर्कअराउंड आज़मा सकते हैं:

  • NODE_PATHपर्यावरण चर में अपने वैश्विक मॉड्यूल स्थान को निर्दिष्ट करें । उदाहरण के लिए

    echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node

    के मान का परीक्षण और प्रिंट करने के लिए NODE_PATH, दौड़ें:

    echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
  • अधिक स्थायी समाधान के लिए, $HOME/.node_modulesइस आदेश को चलाकर, अपने वैश्विक उपयोगकर्ता फ़ोल्डर को रूट फ़ोल्डर में इंगित करने के लिए लिंक करें :

    ln -vs "$(npm root -g)" "$HOME"/.node_modules

    फिर इसके माध्यम से फिर से परीक्षण करें: echo 'require("forever")' | nodeकमांड।

  • अस्थाई रूप से स्क्रिप्ट को लागू करने से पहले, वर्तमान फ़ोल्डर को अस्थायी रूप से जहां एक्सटेंशन को वैश्विक रूप से स्थापित किया गया है, बदल दें। उदाहरण के लिए

    npm install -g forever
    cd "$(npm root -g)"
    echo 'require("forever")' | node
    cd -
  • npmUserconfig फ़ाइल में वैश्विक स्थापना गंतव्य कॉन्फ़िगर करें (देखें :)npm help 5 npmrc या userconfigparam ( --prefix) द्वारा ।

    वर्तमान कॉन्फ़िगरेशन प्रदर्शित करने के लिए, चलाएँ npm config list:।

    वर्तमान कॉन्फ़िगरेशन को संपादित करने के लिए, चलाएँ npm config edit:।

  • कॉल करते समय नोड मॉड्यूल स्थान का पूरा पथ निर्दिष्ट करें require()। उदाहरण के लिए

    require("/path/to/sub/module")
  • कस्टम स्थान पर पैकेज स्थापित करें, जैसे

    npm install forever -g --prefix "$HOME"/.node_modules

    हालांकि, स्थापना के तहत जाना होगा ~/.node_modules/lib/node_modules/ , इसलिए स्थान को अभी भी जोड़ना होगा।

    देखें: कस्टम स्थान के लिए npm स्थानीय इंस्टॉल पैकेज

  • वैश्विक पैकेज के स्थान से वर्तमान फ़ोल्डर में एक सिमलिंक बनाएं । उदाहरण के लिए

    npm link forever

ऐसा लगता है कि 4. वर्तमान नोड_मॉडल फ़ोल्डर। (स्थानीय) 3. से अधिक प्राथमिकता लेता है। $ PREFIX / lib / नोड (वैश्विक)
Kirlyly इस्तवान

स्थानीय नोड_मॉडल फ़ोल्डर हमेशा वैश्विक फ़ोल्डरों पर प्राथमिकता लेते हैं!
किर्ली इस्तवान

14

आप requiregइस समस्या को हल करने के लिए पैकेज का उपयोग कर सकते हैं :

var forever = require('requireg')('forever')

चाल चलेगा।

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


दिलचस्प है, लेकिन NODE_PATH विधि शायद अधिक विहित है
अलेक्जेंडर मिल्स

की सुंदरता NODE_PATHयह भी है, कि आपको किसी भी कोड को बदलने की आवश्यकता नहीं है। (मेरे उपयोग का मामला बहुत सारे छात्र परियोजनाओं को ग्रेड कर रहा है, जहाँ मैं npm installहर एक के लिए नहीं दौड़ना चाहता , और यह भी नहीं चाहता कि वे node_modulesनिर्देशिका प्रदान करें )।
10

नहीं, यह चाल नहीं चलेगी क्योंकि आपको requiregपहली जगह की आवश्यकता नहीं हो सकती है, यह पूरी बात है।
itismydesign

6

सीएलआई उपयोगिताओं के लिए जो बड़े मॉड्यूल पर निर्भर करते हैं, जैसे puppeteer, मुझे स्पॉन पसंद है npm root -gऔर वैश्विक मॉड्यूल की आवश्यकता के लिए इसका उपयोग करते हैं।

try {
  const root = require('child_process').execSync('npm root -g').toString().trim()
  var puppeteer = require(root + '/puppeteer')
} catch (err) {
  console.error(`Install puppeteer globally first with: npm install -g puppeteer`)
  process.exit(1)
}

3

आप इस लाइन को अपनी .profileफ़ाइल में रख सकते हैं :

निर्यात NODE_PATH = "$ (npm विन्यास उपसर्ग प्राप्त करें) / lib / node_modules"

यह nodeवैश्विक पथ का उपयोग करेगा ।


1
नहीं, यह वैश्विक पाने का सामान्य तरीका है node_modules। यह एक पुराना उत्तर है, लेकिन मुझे याद है कि मैं इसे प्रलेखन में कहीं से मिला था। वैसे भी, मेरे कंप्यूटर में (2020 में) वैश्विक npm node_modulesनिर्देशिका है usr/lib/node_modules। वैसे भी, मुझे भरोसा है npm config get prefixक्योंकि जब भी वैश्विक पैकेज स्थापित किया जाता है तो यह npm द्वारा विश्व स्तर पर उपयोग किया जाता है इसलिए यह सही होना चाहिए।
लुइस पाउलो

1
किसी भी तरह से (मैंने अपने प्रारंभिक उत्तर में यह नहीं कहा क्योंकि मैं नोड में बहुत अनुभवी नहीं था। जेएस), एक कार्यक्रम में वैश्विक रूप से स्थापित पैकेज का उपयोग करना एक किनारे का उपयोग मामला है और शायद ही कभी किया जाना चाहिए क्योंकि एक परियोजना में यह पैदा करेगा जब भी परियोजना VCS के लिए प्रतिबद्ध होती है और किसी अन्य परिवेश में उस विशिष्ट निर्भरता के कारण package.jsonफ़ाइल या yarn.lock/ में नहीं होने के कारण समस्याएँ होती हैं package-lock.json
लुइस पाउलो

1
ओह! मैं अब समझता हूँ। मेरा मानना ​​है कि आप पाथ के साथ NODE_PATH को गलत कर रहे हैं। PATH वह जगह है जहां एक शेल निष्पादन योग्य के लिए दिखेगा। NODE_PATH वह जगह है जहाँ नोड संकुल के लिए दिखेगा। यह एक node_modulesफ़ोल्डर के लिए वर्तमान निर्देशिका को देखकर शुरू होगा , फिर यह माता-पिता है, फिर यह माता-पिता है, ... जब तक कि यह एक node_modulesफ़ोल्डर नहीं पाता है जिसमें वह मॉड्यूल होता है। हालाँकि, यदि आप वैश्विक रूप से एक पैकेज स्थापित करते हैं, तो यह node_modulesस्क्रिप्ट की वर्तमान निर्देशिका के ऊपर किसी भी फ़ोल्डर के अंदर नहीं होगा, इसलिए आप NODE_PATH का उपयोग एक बैकबैक के रूप में करेंगे जहां नोड पैकेज की तलाश करेगा।
लुइस पाउलो

1
अहहाहा @ लिसलो पाउलो तुम बिलकुल सही हो !! मुझे माफ कर दो! मैं कोशिश करूंगा और भ्रम, अच्छी नौकरी को रोकने के लिए मेरी कुछ टिप्पणियों को हटा दूंगा और आपको धन्यवाद
रयान टेलर

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