npm पैकेज निर्भरता के रूप में स्थानीय मॉड्यूल कैसे निर्दिष्ट करें


267

मेरे पास एक आवेदन है जो पैकेज में निर्दिष्ट तृतीय पक्ष मॉड्यूल (जैसे 'एक्सप्रेस') पर निर्भरता का सामान्य सेट है। निर्भरता के लिए फ़ाइल। उदाहरण के लिए

"express"     : "3.1.1"

मैं अपने स्वयं के कोड को संरचनात्मक रूप से संरचना करना चाहता हूं और इसमें स्थानीय का एक सेट है (फाइल सिस्टम पर वर्तमान में हूं) मॉड्यूल पैकेज के द्वारा स्थापित किया गया है ।json। मुझे पता है कि मैं चलाकर एक स्थानीय मॉड्यूल स्थापित कर सकता हूं:

npm install path/to/mymodule

हालाँकि, मुझे नहीं पता कि पैकेज के माध्यम से ऐसा कैसे किया जाए। यह निर्भरता संरचना है। --saveइस कमांड में विकल्प का उपयोग करना बस "mymodule": "0.0.0"मेरे package.json में डाला जा रहा है (फ़ाइलपथ स्थान को संदर्भित नहीं करता है)। यदि मैं उसके बाद स्थापित संस्करण को नोड_मॉड्यूल्स से हटाता हूं, और पैकेज.जसन से फिर से स्थापित करने का प्रयास करता हूं, तो यह विफल हो जाता है (क्योंकि यह केंद्रीय रजिस्ट्री में "mymodule" के लिए दिखता है, और स्थानीय रूप से नहीं दिखता है)।

मुझे यकीन है कि "dependencies": {}संरचना को यह बताने का एक तरीका है कि मैं इसे फ़ाइल सिस्टम पथ से स्थापित करना चाहता हूं, लेकिन यह नहीं जानता कि कैसे।

क्या किसी को भी यह समस्या हुई थी? धन्यवाद।


1
एक बहुत अच्छा सवाल। यह महसूस करने के लिए दुःखी है कि package.jsonहमारे पास जो है उसके लिए कोई विशेषता नहीं है Gemfile
जारल

जवाबों:


404

npm install अब इस का समर्थन करता है

npm install --save ../path/to/mymodule

इसके लिए काम करने के लिए mymoduleएक मॉड्यूल के रूप में कॉन्फ़िगर किया जाना चाहिए package.jsonNodeJS मॉड्यूल बनाना देखें ।

Npm 2.0 के रूप में, स्थानीय निर्भरताएँ मूल रूप से समर्थित हैं। ऐसे ही एक सवाल का जवाब danilopopeye देखें । मैंने उनकी प्रतिक्रिया को यहाँ कॉपी किया है क्योंकि यह प्रश्न वेब खोज परिणामों में बहुत ऊँचा है।

यह सुविधा एनपीएम के 2.0.0 संस्करण में लागू की गई थी। उदाहरण के लिए:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

निम्न पथों में से कोई भी मान्य हैं:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

अद्यतन सिंक्रनाइज़ कर रहा है

चूंकि npm installप्रतियों mymoduleमें node_modules, mymoduleनिर्भर स्रोत द्वारा स्वचालित रूप से बदलाव नहीं देखा जाएगा।

निर्भर परियोजना को अद्यतन करने के दो तरीके हैं

  • के संस्करण को अपडेट करें mymoduleऔर फिर उपयोग करेंnpm update : जैसा कि आप ऊपर देख सकते हैं, package.json"निर्भरता" प्रविष्टि में एक संस्करण विनिर्देशक शामिल नहीं है जैसा कि आप सामान्य निर्भरता के लिए देखेंगे। इसके बजाय, स्थानीय निर्भरता के लिए, npm updateबस सुनिश्चित करने के लिए कोशिश करता है नवीनतम संस्करण स्थापित है, के रूप में द्वारा निर्धारित किया जाता mymoduleहै package.json। देखें इस विशिष्ट समस्या का chriskelly का जवाब

  • का उपयोग करके पुनर्स्थापित करें npm installयह mymoduleस्रोत के पथ पर जो कुछ भी है, उसे स्थापित करेगा , भले ही वह पुराना हो, या एक वैकल्पिक शाखा हो, जो भी हो।


2
इसने मेरे लिए काम किया। (मैं अभी एक स्थानीय रिश्तेदार पथ की तरह था"mymodule":"file:mymoduledir"
डॉन रम्मी

72
npm install --save ../my-local-repo
इवान रवे

15
और परियोजना में इसका उपयोग कैसे करें? मैं इसे कॉल करने की कोशिश कर रहा हूं import { HelloWorld } from "my-test-lib";, लेकिन मुझे "कैंट फाइंड मॉड्यूल" त्रुटि प्राप्त होती है। कृपया, stackoverflow.com/questions/46818083/…
विटाली वासिलेन्को

6
@LucioMollinedo क्या आप स्थानीय मॉड्यूल को आयात करने के सिंटैक्स को साझा कर सकते हैं? Vitallii साथ के रूप में, मैं "नहीं किया जा सकता ठीक मॉड्यूल" के साथ त्रुटि मिल रही हैimport { HelloWorld } from "my-test-lib";
स्टेन जेम्स

7
यह एक पैकेज को संदर्भित करने के समान काम नहीं करता है, क्योंकि निर्भरता परियोजना के लिए स्थापित नहीं की जाएगी
ग्लास तोप

44

देखें: package.json में स्थानीय निर्भरता

ऐसा लगता है कि इसका उत्तर है npm link: https://docs.npmjs.com/cli/link


5
वास्तव में npm लिंक केवल सिम्बल को बनाएगा, और स्थानीय निर्भरता को जोड़ने के लिए package.json को संशोधित नहीं करेगा
सेबस्टियन एच।

1
लेकिन अगर इसकी symlinkनिर्भरता खत्म होते ही मूल परियोजना को फिर से बनाने की बात नहीं होगी तो यह कैसे होगा?
जेमी हटबर

11

मुझे अंत में एक साफ रास्ता नहीं मिल रहा था इसलिए मैं एक निर्देशिका बनाने के लिए चला गया local_modulesऔर फिर इस बैशस्क्रिप्ट को पैकेज में जोड़ दिया। लिपियों में स्क्रिप्ट-> पूर्व-स्थापना

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

npm linkकमांड के साथ बहुत संघर्ष करने के बाद (स्थानीय मॉड्यूल विकसित करने के लिए उन्हें रजिस्ट्री में प्रकाशित किए बिना या नोड_मॉडल फ़ोल्डर में एक अलग प्रतिलिपि बनाए रखने के लिए सुझाव दिया गया समाधान), मैंने इस मुद्दे के साथ मदद करने के लिए एक छोटा एनपीएम मॉड्यूल बनाया।

फिक्स में दो आसान चरणों की आवश्यकता होती है ।

प्रथम:

npm install lib-manager --save-dev

दूसरा, इसे अपने में जोड़ें package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Https://www.npmjs.com/package/lib-manager पर अधिक जानकारी । आशा है कि यह किसी की मदद करता है।


0

यदि यह आपके अन्य फ़ाइलों के साथ नोड_मॉड्यूल में पूर्वस्थापित अपने मॉड्यूल को प्रकाशित करने के लिए स्वीकार्य है, तो आप इसे इस तरह कर सकते हैं:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

आप अपने मॉड्यूल को git पर संग्रहीत करना चाहते हैं और अपने माता-पिता को पैकेज बता सकते हैं। git से निर्भरता को स्थापित करने के लिए इसे देखें : https://npmjs.org/doc/json.html#Git-URLs-as-D dependencies


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

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