2013-02-02 14 views
64

के माध्यम से "वैश्विक" एनपीएम निर्भरताओं को स्थापित करना मेरे पास कुछ "वैश्विक" निर्भरताएं हैं (jshint, csslint, buster, आदि ..) कि मैं अपने पैकेज के दौरान कमांड लाइन के माध्यम से स्वचालित रूप से स्थापित और निष्पादन योग्य होना चाहता हूं npm install के माध्यम से स्थापित किया गया है। क्या यह संभव है?पैकेज.जेसन

वर्तमान में, मैं कर रहा हूँ निम्नलिखित मैन्युअल:

  1. npm install -g <package_name>
  2. अपने प्रोजेक्ट के भीतर से
  3. : npm link <package_name>

अद्यतन: बस NPM की this feature request बारे में जाना। ऐसा लगता है कि पैकेज के अंदर scripts कॉन्फ़िगरेशन की तरह है। जेसन जाने का रास्ता है?

फिर से अपडेट करें: या, npm docs पढ़ने के बाद, शायद मुझे .gyp file का उपयोग करना चाहिए? मैं उलझन में हूं।

उत्तर

42

निर्भरता को package.json से "वैश्विक" के रूप में निर्दिष्ट करना संभव नहीं है। और, यह डिजाइन द्वारा इसहाक states in that feature request के रूप में संदर्भित है:

हाँ, हम ऐसा कभी नहीं करेंगे।

लेकिन, "बाइनरी" का उपयोग तब भी किया जा सकता है जब पैकेज स्थानीय रूप से स्थापित होता है। वे .../node_modules/.bin/ में होंगे। और, आप उन्हें preinstall script के साथ कतार में सक्षम होना चाहिए।

हालांकि, अगर आदेशों की श्रृंखला बल्कि लंबा है (के रूप में "JSHint, csslint, बस्टर, आदि .." सुझाव है), तो आप एक निर्माण उपकरण जैसे grunt का उपयोग कर विभिन्न प्रदर्शन करने में देखना चाहते हो सकता है कार्य:

{ 
    // ..., 

    "scripts": { 
     "preinstall": "grunt" 
    } 
} 
+0

धन्यवाद @ जोनाथन। मुझे लगता है कि आप सही हैं। मेरे पास वर्तमान में 'इंस्टॉल' नामक एक कचरा कार्य है जो आधुनिकताकार, jquery, आदि का निर्माण करता है .. और यादृच्छिक फ़ाइलों को मेरे lib फ़ोल्डर में कॉपी करता है। इसका मतलब है कि डेवलपर्स को खुद को वैश्विक पैकेज स्थापित करने की आवश्यकता होगी, लेकिन ओह ठीक है, यह मेरे ऐप की चिंता नहीं होनी चाहिए। – uglymunky

+1

आपके ऐप को अपनी निर्भरताओं को दस्तावेज करना चाहिए और, मेरी राय में, सुनिश्चित करें कि वे किसी भी तरह से मौजूद हैं। – EndangeredMassa

+3

https://www.npmjs.org/doc/misc/npm-scripts.html कहता है कि इंस्टॉल स्क्रिप्ट का उपयोग एक विरोधी पैटर्न है। – Fdr

25

मैं वास्तव में पैटर्न जहां स्थानीय निर्भरता स्थापित करते हैं, तो एक bash स्क्रिप्ट ./node_modules/.bin करने के लिए अपने पथ सेट का उपयोग की तरह।

फ़ाइल: env.sh

# Add your local node_modules bin to the path for this command 
export PATH="./node_modules/.bin:$PATH" 

# execute the rest of the command 
exec "[email protected]" 

उसके बाद, आप किसी भी पार्टी आदेश से पहले इस स्क्रिप्ट का उपयोग कर सकते हैं। आप युग्मित करते हैं कि एक Makefile या NPM स्क्रिप्ट के साथ:

फ़ाइल: Makefile

lint : 
    ./env.sh csslint my_styles 

फ़ाइल: package.json

"scripts": { 
    "lint": "./env.sh csslint my_styles" 
} 

यह इन फ़ाइलों में कार्य वे संदर्भ की तरह लग रहे कुछ वैश्विक स्थान में csslint, लेकिन वे वास्तव में आपके node_modules बिन में संस्करण का उपयोग करें।

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

+1

क्या आप विस्तार कर सकते हैं कि जब भी आप '।/Node_modules/.bin/'कमांड को कॉल करना चाहते हैं, तो पथ सेट करने के लिए आप स्क्रिप्ट का उपयोग क्यों कर रहे हैं? आपके उदाहरण में, हर बार जब आप 'लिंट' चलाते हैं, तो आप अपने पथ पर '।/Node_modules/.bin' प्रीपेड करेंगे, भले ही यह पहले से मौजूद हो। क्यों न सिर्फ अपनी प्रोफ़ाइल में पथ सेट करें? यदि आदेश वहां नहीं है, तो शेष शेष '$ PATH' में दिखना जारी रखेगा। – N13

+1

मैं चाहता हूं कि यह किसी के द्वारा प्रयोग योग्य हो। मैं इसे अपनी प्रोफ़ाइल में सेट कर सकता हूं और यह मेरे लिए काम करेगा, लेकिन फिर इस मॉड्यूल पर काम करने वाले हर किसी को भी ऐसा करना होगा। ध्यान दें कि './env.sh' की आवश्यकता नहीं है पैकेज.जेसन 'स्क्रिप्ट्स' में अब और आवश्यक है। – EndangeredMassa

+2

मुझे अभी भी समझ में नहीं आता कि आप 'पथ' क्यों सेट कर रहे हैं। यदि सभी '।/Node_modules/.bin /' आदेशों को 'env.sh' के माध्यम से रूट किया जाता है, तो' पथ 'के साथ फ़ुटज़ क्यों होता है? 'Exec ./node_modules/.bin/$ @' पर्याप्त नहीं है? – N13

7

आप इस प्रयास करना चाहिए: https://github.com/lastboy/package-script

मैं सीधे package.json से वैश्विक NPM पैकेज इंस्टॉल करने में प्रयोग किया गया है। यह उन ग्राहकों के लिए अच्छा काम करता है जो तकनीकी रूप से साक्षर नहीं हैं।

यह जांचता है कि पैकेज पहले से इंस्टॉल हैं या नहीं, अगर उन्हें इंस्टॉल नहीं किया गया है!

संबंधित मुद्दे