पैकेज में स्थानीय निर्भरता। Json


453

मैं ऐसा कुछ करना चाहता हूं, इसलिए इसकी निर्भरता npm installभी अधिक या महत्वपूर्ण रूप package.jsonसे स्थापित करता है ../somelocallib

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

जवाबों:


583

npm> = 2.0.0

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

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

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

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

स्थानीय पैकेज दिया जाएगा प्रतिलिपि बनाई करने के लिए उपसर्ग ( ./node-modules)।

एनपीएम <2.0.0

somelocallibअपने package.jsonसामान्य के रूप में निर्भरता के रूप में रखो :

"dependencies": {
  "somelocallib": "0.0.x"
}

फिर चलाएं npm link ../somelocallibऔर npm उस संस्करण को स्थापित करेंगे जिसे आप एक सिमलिंक के रूप में काम कर रहे हैं ।

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

संदर्भ: लिंक (1)


3
हम इसे कैसे हटा सकते हैं?
अताउर्रहमान असद

13
"एनपीएम लिंक" के साथ स्थानीय पैकेजों को स्थापित करने का नकारात्मक पक्ष यह है कि आपको बहुत सारे मॉड्यूल दोहराव मिलते हैं। जब आप "मॉड्यूल: संस्करण" या "मॉड्यूल: गिट-रेपो" के साथ अपनी निर्भरता को सूचीबद्ध करते हैं, तो एनपीएम इंस्टॉल एल्गोरिथ्म एक पैकेज स्थापित करने से बचता है जो पहले से ही एक मूल पैकेज में स्थापित है। तो "npm लिंक" के साथ, यदि आपका मुख्य अनुप्रयोग "async@0.8.0" पर निर्भर करता है और आपके सभी स्थानीय पैकेज "async@0.8.0" पर भी निर्भर करते हैं, तो आप "async@0.8" स्थापित करने वाले सभी स्थानीय पैकेजों के साथ समाप्त हो जाएंगे। मुख्य एप्लिकेशन के समान "इंस्टॉल किए गए" संस्करण का उपयोग करने के बजाय ""। यह "npm स्थापित फ़ोल्डर" का उपयोग करके नहीं होता है।
पेड्रो बैलेस्टरोस

3
@PedroBallesteros आप npm dedupइस समस्या को ठीक करने के लिए उपयोग कर सकते हैं । npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"स्थानीय पैकेज की प्रतिलिपि बनाई जाएगी ..." ऐसा प्रतीत नहीं होता है कि हाल ही के npm संस्करण के साथ मामला है। अब, एक सिमलिंक बनाया गया है।
tsauerwein

2
@danilopopeye प्रति docs.npmjs.com/cli/install npm install <folder> विवरण कहते हैं कि वर्तमान परियोजना में
हरमन जे। रैडके III

211

अब अपने package.jsonसीधे स्थानीय नोड मॉड्यूल संस्थापन पथ को निर्दिष्ट करना संभव है । डॉक्स से:

स्थानीय पथ

संस्करण 2.0.0 के रूप में आप एक स्थानीय निर्देशिका को एक पथ प्रदान कर सकते हैं जिसमें एक पैकेज होता है। इनमें से किसी भी रूप का उपयोग करके स्थानीय रास्तों को बचाया जा सकता है npm install -Sया npm install --save:

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

किस मामले में उन्हें एक रिश्तेदार पथ के लिए सामान्यीकृत किया जाएगा और आपके साथ जोड़ा जाएगा package.json। उदाहरण के लिए:

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

यह सुविधा स्थानीय ऑफ़लाइन विकास और परीक्षण बनाने के लिए सहायक है, जिसमें एनपीएम स्थापित करने की आवश्यकता होती है जहां आप एक बाहरी सर्वर को हिट नहीं करना चाहते हैं, लेकिन इसका उपयोग सार्वजनिक रजिस्ट्री में पैकेज प्रकाशित करते समय नहीं किया जाना चाहिए।


23
Npm v.3 + में, सामान्यीकरण निरपेक्ष है, सापेक्ष नहीं है , इसलिए आपको कुछ ऐसा दिखाई देगा"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
संस्करण वृद्धि के बिना स्थानीय पथ निर्भरता को कैसे अपडेट करें?
बोहादान लेज़्नेट्स

3
वैसे, यह सभी प्रकार की परेशानी का कारण बनता है जब और / या यदि आप अपने नोड एप्लिकेशन को डॉकटराइज़ करने की कोशिश करते हैं, क्योंकि मानक node:onbuildछवियां केवल वर्तमान निर्देशिका की प्रतिलिपि बनाती हैं, और इस प्रकार कुछ भी बाहर छोड़ देती हैं ../foo
donmartin

4
क्या इसे git + ssh के साथ एकीकृत करने का कोई तरीका है ताकि किसी के पास git रिपॉजिटरी की एक स्थानीय प्रति हो सकती है जो वे npm installLAN पर या किसी अन्य git रिपॉजिटरी से लेते हैं ? जब मैं ऊपर और npm को git + ssh से संस्थापित करने की कोशिश करता हूँ तो यह नोड_मॉड्यूल निर्देशिका में दिखता है और git + ssh पर जाने का प्रयास नहीं करता है, भले ही मैं शीर्ष स्तर के पैकेज को कैसे स्थापित कर रहा हूँ।
माइकल

1
काम स्थापित करना। लेकिन इस तरह से मुझे मेरी परियोजना में मॉड्यूल आयात करने की कोशिश करते समय "ईआरआर नहीं मिला" मिलेगा।
C4d

87

यह मेरे लिए काम करता है।

अपने package.json फ़ाइल में निम्नलिखित रखें

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
सुझाव के लिए धन्यवाद कि "
npm

इसे .gitignoreमॉड्यूल फ़ोल्डर में हटा दिया गया, .npmignoreऔर पहली बार जब मैंने इसे चलाया तो इसे छोड़कर सभी फ़ोल्डरों पर 777 पुनरावर्ती रूप से लागू किया गया node_modules। लेकिन हां, इसने आश्रितों को स्थापित किया। एनपीएम संस्करण 1.4.14 का उपयोग करना।
L0LN1NJ4

इसका उपयोग किया है, लेकिन नोड_मॉडल्स के साथ खिलवाड़ करने के बजाय मैंने app_modules का उपयोग किया है
उत्प्रेरक

1
क्यों नहीं "dependencies": { "my-own-module": "file:../my-own-module" }?
बोहादान लेज़्नेट्स

1
मैं यहाँ @Bddan से सहमत हूँ। स्थानीय निर्भरताएं ठीक यही काम करेंगी। उपयोग करने npm linkका लाभ यह है कि आपको npm installअपनी निर्भरता प्राप्त करने के लिए प्रत्येक बार करने की आवश्यकता नहीं है ।
मेंढ़क

30

यदि आप इसे और अधिक स्वचालित करना चाहते हैं, क्योंकि आप अपने मॉड्यूल को संस्करण नियंत्रण में देख रहे हैं, और npm लिंक को याद रखने वाले देवों पर भरोसा नहीं करना चाहते हैं, तो आप इसे अपने पैकेज में जोड़ सकते हैं। "स्क्रिप्ट" खंड।

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

यह हैकी से परे लगता है, लेकिन यह "काम" लगता है। इस npm मुद्दे से टिप मिला: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
क्यों postinstallऔर postupdateके बजाय preinstallऔर preupdate?
14

1
क्या आप थोड़ा और समझा सकते हैं कि यह क्या करता है। यदि मैं एक रूट प्रोजेक्ट को कई रूट फ़ोल्डर ("मल्टी-रूट वर्कस्पेस") के साथ सेट करता हूं, तो क्या यह उपभोग्य परियोजनाओं के लिए तुरंत मॉड्यूल फ़ोल्डर में परिवर्तन को प्रतिबिंबित करने में सक्षम होगा? - क्या यह हैक के बारे में है?
bvdb

26

यह है कि आप स्थानीय निर्भरता कैसे जोड़ेंगे:

npm install file:src/assets/js/FILE_NAME

इसे NPM से package.json में जोड़ें:

npm install --save file:src/assets/js/FILE_NAME

सीधे इस तरह से package.json में जोड़ें:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

मास्टर प्रोजेक्ट

यहाँ पैकेज है। आप मास्टर प्रोजेक्ट के लिए उपयोग करेंगे।

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

वहाँ, ./somelocallibपुस्तकालय फ़ोल्डर में संदर्भ है मास्टर परियोजना package.json के सापेक्ष के रूप में

संदर्भ: https://docs.npmjs.com/files/package.json#local-paths


उप परियोजना

अपने पुस्तकालय की निर्भरता को संभालें।

दौड़ने के अलावा npm install, आपको दौड़ने की आवश्यकता होगी (cd node_modules/somelocallib && npm install)

यह एनपीएम के साथ एक ज्ञात बग है।

संदर्भ: https://github.com/npm/npm/issues/1341 (अधिक अप-टू-डेट संदर्भ की मांग)


डॉकटर के लिए नोट्स

अपने मास्टर package.lockऔर somelocallib/package.lockअपने स्रोत कोड प्रबंधक में जाँच करें।

फिर अपने डॉकरीफाइल उपयोग में:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

मैं अपने (cd A && B)निर्माण में कोष्ठक का उपयोग करता हूं ताकि ऑपरेशन को बेकार बनाया जा सके।


3

मुझे पता है कि npm install ../somelocallibकाम करता है।

हालाँकि, मुझे नहीं पता कि आप प्रश्न में जो सिंटैक्स दिखाते हैं वह काम करेगा या नहीं package.json...

दुर्भाग्य से, डॉक्टर केवल निर्भरता के रूप में URL का उल्लेख करते हैं।

प्रयत्न file:///.../...tar.gz , एक ज़िपित स्थानीय दायित्व की ओर इशारा करते हुए ... और हमें बताएं कि क्या यह काम करता है।


1
मैं "निर्भरता": {"somemodule": "file: ///./internal_modules/somemodule"} को package.json में जोड़ता हूं। यह काम नहीं करता है। त्रुटि कोड "npm ERR! कोड E404" है।
जेफरी

2

यह मेरे लिए काम करता है: पहले, सुनिश्चित करें कि npm निर्देशिकाओं का सही उपयोगकर्ता है

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

फिर आपके पैकेज में आपका। Json डायरेक्टरी को लिंक करता है

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
XP en.wikipedia.org/wiki/NTFS_symbolic_link के बाद से विंडोज पर प्रतीकात्मक लिंक संभव हैं । कमांड लाइन को व्यवस्थापक के रूप में खोलें, फिर चलाएं npm install
वतन

2

दरअसल, npm 2.0 के रूप में, अब स्थानीय पथों का समर्थन है ( यहां देखें )।


8
माइकल ट्राउव ने कुछ हफ्तों पहले ही यह जवाब दिया था, इसलिए डुप्लिकेट क्यों?
दान डेस्कलेस्क्यू

2

जिज्ञासु ..... कम से कम विंडोज पर (मेरा npm है 3.something) मुझे यह करने की आवश्यकता है:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

जब मैंने ऐसा किया तो npm install ../module1 --saveइसका परिणाम पूर्ण पथ था और दस्तावेज के सापेक्ष नहीं।

मैंने थोड़ा और गड़बड़ किया और यह निर्धारित किया कि ../xxxपर्याप्त था।

विशेष रूप से, मेरे पास d: \ build \ mod1, d: \ build \ मॉड्यूल 2 और मेरे नोड प्रोजेक्ट (एप्लिकेशन) के लिए d: \ build \ nodeApp कहने के लिए स्थानीय नोड मॉड्यूल हैं।

'स्थापित' करने के लिए, मैं:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

मॉड्यूल 1 के पैकेज.जॉन में "मॉड्यूल 2" की एक निर्भरता है: "../module2"; मॉड्यूल 2 की कोई स्थानीय निर्भरता नहीं है; नोडएप की निर्भरता "मॉड्यूल 1": "../module1" और "मॉड्यूल 2": "../module2" है।

सुनिश्चित नहीं है कि यह केवल मेरे लिए काम करता है क्योंकि सभी 3 फ़ोल्डर्स (मॉड्यूल 1, मॉड्यूल 2 और नोडएपी) उसी स्तर पर बैठते हैं ......।


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