नोड_मॉड्यूल्स में स्थानीय रूप से स्थापित पैकेज से निष्पादन योग्य का उपयोग कैसे करें?


493

मैं में एक मॉड्यूल के स्थानीय संस्करण का उपयोग कैसे करूँ node.js। उदाहरण के लिए, मेरे ऐप में, मैंने कॉफी-स्क्रिप्ट स्थापित की:

npm install coffee-script

यह इसे स्थापित करता है ./node_modulesऔर कॉफी कमांड में है ./node_modules/.bin/coffee। क्या इस कमांड को चलाने का कोई तरीका है जब मैं अपनी परियोजना के मुख्य फ़ोल्डर में हूं? मुझे लगता है कि मैं bundle execबंडलर में कुछ इसी तरह की तलाश कर रहा हूं । मूल रूप से, मैं कॉफी-स्क्रिप्ट का एक संस्करण निर्दिष्ट करना चाहूंगा जिसे परियोजना में शामिल सभी को उपयोग करना चाहिए।

मुझे पता है कि मैं -gध्वज को विश्व स्तर पर स्थापित करने के लिए जोड़ सकता हूं इसलिए कॉफी कहीं भी ठीक काम करती है, लेकिन क्या होगा अगर मैं प्रति प्रोजेक्ट कॉफी के विभिन्न संस्करण चाहता हूं?


9
बहुत सारे निर्देश मैंने पढ़े हैं जैसे कि npm install niftycommandऔर फिर बातें niftycommand। लेकिन यह तब तक काम नहीं करेगा जब तक आपके पास नहीं हो ।/node_modules/.bin अपने रास्ते में, क्या यह होगा?
बेनेट मैकलेवे 5

2
यहाँ एक बहुत अच्छा राइटअप है: firstdoit.com/… - मूल रूप से यह आपको अपनी coffeeकमांड को npm scriptsसेक्शन में डालने की सलाह देता है , जैसे "build": "coffee -co target/directory source/directoy", so you can run टर्मिनल से npm रन बिल्ड`।
बेनी न्युगबॉएर

@ बेनीइजेनबॉएर वास्तव में, यही मैं हाल ही में पाथ के साथ खिलवाड़ करने के बजाय कर रहा हूं
टाइपऑनरीयर

12
का प्रयोग करें npxजो के साथ आता है npm 5.2.0 medium.com/@maybekatz/...
onmyway133

जवाबों:


567

अद्यतन : जैसा कि Seyeong Jeong नीचे उनके उत्तर में बताते हैं, क्योंकि npm 5.2.0 आप उपयोग कर सकते हैं npx [command], जो अधिक सुविधाजनक है।

5.2.0 से पहले के संस्करणों के लिए OLD ANSWER :

डालने की समस्या

./node_modules/.bin

आपके पेट में है कि यह तभी काम करता है जब आपकी वर्तमान वर्किंग डायरेक्टरी आपके प्रोजेक्ट डायरेक्टरी स्ट्रक्चर (यानी की लोकेशन node_modules) की जड़ हो।

आपकी कार्यशील निर्देशिका क्या है, इसके बारे में स्वतंत्र होने पर आप स्थानीय स्तर पर स्थापित बायनेरिज़ का रास्ता पा सकते हैं

npm bin

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

PATH=$(npm bin):$PATH coffee

मैंने इसे npm-exec पर अलियास किया

alias npm-exec='PATH=$(npm bin):$PATH'

तो, अब मैं कर सकता हूँ

npm-exec coffee

मैं कहां हूं, इससे कोई फर्क नहीं पड़ता कॉफी की सही प्रतिलिपि चलाने के लिए

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee

17
तुम भी एक कदम आगे औरalias coffee="npm-exec coffee"
नियमित रूप से

6
जब आप किसी अन्य प्रोजेक्ट में सीडी का आउटपुट बदलते हैं। जब आप किसी प्रोजेक्ट के भीतर cd करते हैं तो यह नहीं बदलता है। npm binएक नोड_मॉड्यूल्स निर्देशिका के लिए cwd को 'पूर्वजों निर्देशिकाओं' की श्रृंखला खोजता है। यह वास्तव में वांछित व्यवहार है यदि आप विशेष रूप से प्रोजेक्ट के पैकेज में सूचीबद्ध मॉड्यूल के बायनेरिज़ का उपयोग करना चाहते हैं। json।
नियमित

11
हे भगवान! क्या मुझे अपने स्थानीय मॉड्यूल को काम करने के लिए वास्तव में ऐसा कुछ करना होगा? यह एक टीम को समझाने के लिए काफी अव्यावहारिक है! वहाँ कुछ भी नहीं है थोड़ा और अधिक सीधा?
एलेक्सियन

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

6
@philosodad, वास्तव में नहीं, आप नहीं। PATHक्या यह आदेश मंगलाचरण से पहले था वापस करने के लिए किया जाएगा। एक कमांड चलाने से पहले एक ही लाइन में एक पर्यावरण चर सेट करना, केवल उस कमांड के वातावरण को प्रभावित करता है।
नियमित

410

अच्छा उदाहरण है

आप $PATHअब और हेरफेर करने की जरूरत नहीं है !

से npm@5.2.0 , NPM साथ जहाजों npxकी सहायता से पैकेज आप एक स्थानीय से कमांड चलाने node_modules/.binया एक केंद्रीय कैश से।

बस चलाते हैं:

$ npx [options] <command>[@version] [command-arg]...

डिफ़ॉल्ट रूप से, npxजाँच करेगा कि क्या <command>मौजूद है $PATH, या स्थानीय प्रोजेक्ट बायनेरिज़ में, और उस पर अमल करें।

कॉलिंग npx <command>जब <command>आपके पहले से नहीं है, तो $PATHस्वचालित रूप से आपके लिए NPM रजिस्ट्री से उस नाम के साथ एक पैकेज स्थापित करेगा, और इसे लागू करेगा। जब यह हो जाता है, तो स्थापित पैकेज आपके ग्लोबल्स में कहीं भी नहीं होगा, इसलिए आपको लंबे समय तक प्रदूषण के बारे में चिंता करने की आवश्यकता नहीं होगी। आप --no-installविकल्प प्रदान करके इस व्यवहार को रोक सकते हैं ।

इसके लिए npm < 5.2.0, आप npxनिम्न कमांड चलाकर मैन्युअल रूप से पैकेज स्थापित कर सकते हैं :

$ npm install -g npx

1
मैं जबकि 3 पार्टी वैश्विक NPM संकुल स्थापित करने पसंद नहीं npmऔर package.jsonलगभग एक ही सुविधा प्रदान करता है।
गनीस

यदि "पथ एक स्ट्रिंग होना चाहिए। अपरिभाषित प्राप्त होता है" संदेश प्रकट होता है, यहाँ एक फिक्स है: github.com/zkat/npx/issues/144#issuecomment-391031816
वेलेरी कटकोव

1
यह उत्तर अच्छा है। लेकिन मैं सिर्फ इतना कहना चाहता हूं कि npxयह लंगड़ा है। यह किया जाना चाहिए था npm runया npm execया कुछ और।
विलियम एंट्रीकेन

@WilliamEntriken कुछ कारणों से, npm run [my-local-package]मेरे Ubuntu पर काम नहीं कर रहा है, हालाँकि ऐसा लगता है कि यह विंडोज डिवाइस पर काम करता है।
घड़ी की कल की

97

npm binअपनी परियोजना के नोड मॉड्यूल / बिन निर्देशिका प्राप्त करने के लिए कमांड का उपयोग करें

$ $(npm bin)/<binary-name> [args]

जैसे

$ $(npm bin)/bower install

4
मुझे यह सरल और सामान्य समाधान पसंद है। एक उपनाम अनावश्यक लगता है।
मैट मोंटेग

लगता है कि अगला सबसे अच्छा समाधान है जो सुरुचिपूर्ण है और करने के लिए अधिक सुरक्षित हैexport PATH="./node_modules/.bin:$PATH"
23:15

1
@ inf3rno कमांड है $(npm bin)/jasmine, नहीं node $(npm bin)/jasmine(आप शायद इसे समझ गए हैं लेकिन दूसरों के लिए स्पष्ट कर रहे हैं)।
जस्सा

5
एक बुरा समाधान नहीं है, लेकिन यह $ के साथ एक मानक विंडोज़ कमांड लाइन पर नहीं चलता है। यह पैकेज में रखा गया है। जसन स्क्रिप्ट सेक्शन एक बेहतर तरीका है जो मुझे लगता है, क्योंकि यह अधिक संगत है।
टिमोथी गोंजालेज

77

उपयोग npm run[-script] <script name>

अपने स्थानीय ./node_modulesनिर्देशिका में बिन पैकेज स्थापित करने के लिए npm का उपयोग करने के बाद , इस तरह package.jsonजोड़ने के लिए संशोधित <script name>करें:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

अच्छा होगा अगर npm install में एक --add-script विकल्प या कुछ और है या यदि npm रन स्क्रिप्ट ब्लॉक में जोड़े बिना काम करेगा।


5
मैंने एक प्रोजेक्ट पर कई डेवलपर्स के साथ काम करते समय इस दृष्टिकोण को अधिक समान पाया - यह स्थानीय रूप से कुछ भी कॉन्फ़िगर करने की आवश्यकता से बचता है ... आप बस npm installतब आपके पास अपने देव निर्भरता तक पहुंचते हैं। केवल मामूली नीचे की ओर आपको npm run eslint(या जो भी) की आवश्यकता है। आप "स्टार्ट" नामक एक स्क्रिप्ट बना सकते हैं जो गल्प चलाता है ताकि आपको केवल npm startअपना देव सर्वर शुरू करने के लिए टाइप करना पड़े । बहुत अच्छा सामान और कोई बैश अच्छाई नहीं है, इसलिए आपके विंडोज़ के मित्र अब भी आपको पसंद करते हैं। :)
jpoveda

1
अपने रास्ते पर $ (npm बिन) डालने के लिए एक उपनाम जोड़ना चतुर है, लेकिन यह तथ्य कि यह स्थानीय कॉन्फ़िगरेशन के बिना लोगों के लिए काम करेगा मेरा दिल जीतता है
कॉनराड। डैन

12
यह अधिक upvotes की जरूरत है! पास आने के बाद अपनी स्क्रिप्ट्स पर जाएं --:npm run learnyounode -- --normal-switches --watch -d *.js
ptim

मुझे यह सबसे अच्छा उपाय भी लगता है। यहाँ गहराई से व्याख्या की गई है: Lostechies.com/derickbailey/2012/04/24/…
adampasz

1
यह वह है जो मैं आमतौर पर जाता हूं, लेकिन कुछ कारणों से, एक Ubuntu डिवाइस पर, npm run ts-nodeमेरे लिए काम नहीं कर रहा है। मैं बस npx को ressort करना होगा।
घड़ी की कल की

42

का उपयोग करें npm-run

रीडमी से:

NPM रन

नोड_मॉड्यूल से स्थानीय निष्पादक खोजें और चलाएं

Npm जीवन चक्र स्क्रिप्ट के लिए उपलब्ध कोई भी निष्पादन योग्य उपलब्ध है npm-run

प्रयोग

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

स्थापना

$ npm install -g npm-run

8
अब और नहीं, ऊपर देखें npx देखें ... stackoverflow.com/a/45164863/3246805
tj 19

41

अद्यतन: मैं अब इस विधि की अनुशंसा नहीं करता, दोनों उल्लेखित सुरक्षा कारणों के लिए और कम से कम नए npm binआदेश के लिए नहीं। नीचे मूल उत्तर:

जैसा कि आपको पता चला है, कोई भी स्थानीय रूप से स्थापित बायनेरिज़ में हैं ./node_modules/.bin। विश्व स्तर पर उपलब्ध बायनेरिज़ के बजाय हमेशा इस निर्देशिका में बायनेरिज़ को चलाने के लिए, यदि वर्तमान में, मेरा सुझाव है कि आप ./node_modules/.binअपने रास्ते में सबसे पहले रखें:

export PATH="./node_modules/.bin:$PATH"

यदि आप इसे अपने में रखते हैं ~/.profile, coffeeतो हमेशा ./node_modules/.bin/coffeeउपलब्ध होगा, अन्यथा /usr/local/bin/coffee(या जो भी उपसर्ग आप के तहत नोड मॉड्यूल स्थापित कर रहे हैं)।


1
यह शायद सबसे अच्छा समाधान है। मैंने अपने प्रोजेक्ट में "वॉच" नामक एक बैश स्क्रिप्ट भी बनाई:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
टाइपोनेरोर

72
खतरे, रॉबिन्सन! आपके $ पेट में रिश्तेदार रास्तों का उपयोग एक सुरक्षा छेद को ग्रह के आकार को खोलता है, खासकर यदि आप उन्हें पहले आइटम के रूप में सामने रखते हैं। यदि निर्देशिका आप में हैं हर किसी के द्वारा लिखने योग्य है (में कहीं कहते हैं /tmp), किसी भी प्रक्रिया या उपयोगकर्ता (जैसे साधारण आदेशों की दुर्भावनापूर्ण संस्करणों रख कर अपनी सत्र का अपहरण कर सकते हैं ls, cpआदि) वहाँ। ये आपके पासवर्ड वगैरह को कैप्चर करने वाले 'इनविजिबल' सब-शेल को स्पॉन कर सकते हैं।
एक

केवल जड़ और अन्य स्थानों पर काम नहीं करेगा। alias npm-exec='PATH=$(npm bin):$PATH'बरसाती कोट है।
ऑलिगॉफेन

1
यह कितना बुरा है यदि आप इसे पहली चीज़ के रूप में नहीं रखते हैं PATH, लेकिन अंतिम ( $(npm bin)फॉर्म का उपयोग करके )? इसलिए वे आपके मौजूदा सामान को अधिलेखित नहीं कर सकते हैं, और आप npm binपहले से ही संस्करण की परवाह किए बिना निर्देशिका में निष्पादकों पर भरोसा कर रहे होंगे PATH; खतरा मॉडल यह हो सकता है कि क) कोई दुर्भावनापूर्ण आपकी फ़ाइल प्रणाली तक पहुँच प्राप्त करता है, ख) वे निष्पादन नामों को उन नामों के साथ जोड़ते हैं जो उन सिस्टम टूल्स के करीब हैं, और ग) क्या आप गलत हैं? ऐसे परिदृश्यों को समझने की कोशिश करना जो इसे बुरा बनाते हैं, यह देखते हुए कि आप पहले से ही विदेशी निष्पादकों पर भरोसा कर रहे हैं, जब npm-प्रोग्रामों का उपयोग करके ।
ओसियाब

आप एक उपनाम के साथ शेल चालें कर सकते हैं और आप मैन्युअल रूप से पथ कर सकते हैं और यह "काम करता है" लेकिन यह काफी आदर्श नहीं है।
किल्स्स्क्रीन

22

PATH समाधान में यह समस्या है कि यदि $ (npm बिन) को आपके .profile / .bashrc / etc में रखा गया है, तो इसका मूल्यांकन एक बार किया जाता है और हमेशा के लिए निर्धारित किया जाता है जो कि जिस भी मार्ग में पहली बार मूल्यांकन किया गया था। यदि इसके बजाय आप वर्तमान पथ को संशोधित करते हैं। हर बार जब आप स्क्रिप्ट चलाएंगे तो आपका रास्ता बढ़ेगा।

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

function npm-exec {
   $(npm bin)/$@  
}

यह आपके पर्यावरण में कोई बदलाव किए बिना इस तरह से इस्तेमाल किया जा सकता है:

npm-exec r.js <args>

2
यह मुझे पंसद है! मैं बस मेरी समारोह नामितn
jontsai

यह भी खूब रही! साझा करने के लिए धन्यवाद। मैंने नीचे एक फिश शेल वर्जन जोड़ा।
लियोन - हान ली

22

यदि आप npm रखना चाहते हैं, तो npx को वह करना चाहिए जो आपको चाहिए।


यदि यार्न पर स्विच करना (फेसबुक द्वारा एनपीएम रिप्लेसमेंट) आपके लिए एक विकल्प है, तो आप कॉल कर सकते हैं:

 yarn yourCmd

package.json के अंदर स्क्रिप्ट पूर्वता लेगा, अगर कोई नहीं मिला तो यह ./node_modules/.bin/फ़ोल्डर के अंदर दिखेगा ।

यह भी चलाता है कि यह क्या चला गया:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

इसलिए आपको अपने प्रत्येक कमांड के लिए स्क्रिप्ट सेट करने की आवश्यकता नहीं है package.json


यदि आपके पास एक स्क्रिप्ट है जो .scriptsआपके अंदर परिभाषित है package.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tscyarn run tscया के बराबर होगा npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

14

अद्यतन: यदि आप हाल ही में npm पर हैं (संस्करण> 5.2)

आप उपयोग कर सकते हैं:

npx <command>

npx.binआपकी निर्देशिका में कमांड के लिए दिखता हैnode_modules

पुराना उत्तर:

विंडोज के लिए

निम्नलिखित नामक एक फ़ाइल को स्टोर करें npm-exec.batऔर इसे अपने में जोड़ें%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

प्रयोग

फिर आप इसका उपयोग कर सकते हैं npm-exec <command> <arg0> <arg1> ...

उदाहरण के लिए

wdioस्थानीय node_modules निर्देशिका में स्थापित निष्पादित करने के लिए , करें:

npm-exec wdio wdio.conf.js

यानी यह चलेगा .\node_modules\.bin\wdio wdio.conf.js


1 से अधिक तर्क पास करते समय यह काम नहीं करता है। जैसे npm-exec gulp <some_task>
OK999

@ OK9999 मुझे यकीन है कि कुछ मामूली संशोधन तर्क पारित करने की अनुमति देगा (क्योंकि जब आप इसे यहाँ से गुजरते हैं, तो यह "") में उद्धृत किया जा रहा है; मेरा सुझाव है कि बिन से अपने प्रोजेक्ट रूट पर gulp फ़ाइल को कॉपी पेस्ट करें (फ़ाइल के कुछ संशोधनों की आवश्यकता है, लेकिन यह सिर्फ नए कोड आदि को लिखने के बिना काम करेगा)
धीरज भास्कर

हां, मैंने ऐसा करना समाप्त कर दिया। नोड_मॉडल्स फ़ोल्डर को उस फ़ोल्डर में होना चाहिए जहां gulpfile मौजूद है
OK999

6

मैं शेल उपनामों या किसी अन्य पैकेज पर भरोसा नहीं करना पसंद करता हूं।

scriptsअपने अनुभाग में एक सरल रेखा जोड़कर package.json, आप स्थानीय npm कमांड जैसे चला सकते हैं

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}

5

यदि आप चाहते हैं कि आपका PATH वैरिएबल आपके वर्तमान वर्किंग डाइरेक्टरी के आधार पर सही ढंग से अपडेट हो, तो इसे अपने .bashrcअसमान के अंत में जोड़ें (या किसी भी चीज़ को परिभाषित करने के बाद PATH):

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

इससे हर बार बैश प्रॉम्प्ट (आपकी परियोजना के आकार के आधार पर, सबसे अधिक संभावना है) में थोड़ी देरी हो सकती है, इसलिए यह डिफ़ॉल्ट रूप से अक्षम है।

आप अपने टर्मिनल के भीतर node-modeऔर node-mode-offक्रमशः, इसे सक्षम और अक्षम कर सकते हैं।


4

मैंने हमेशा इस समस्या को हल करने के लिए @guneysus के रूप में एक ही दृष्टिकोण का उपयोग किया है, जो package.json फ़ाइल में एक स्क्रिप्ट बना रहा है और इसका उपयोग npm रन स्क्रिप्ट-नाम से चल रहा है।

हालांकि, हाल के महीनों में मैं npx का उपयोग कर रहा हूं और मुझे यह पसंद है।

उदाहरण के लिए, मैंने एक कोणीय परियोजना डाउनलोड की और मैं विश्व स्तर पर कोणीय CLI स्थापित नहीं करना चाहता था। तो, इस तरह से वैश्विक कोणीय cli कमांड (यदि मैंने इसे स्थापित किया था) का उपयोग करने के बजाय, npx स्थापित किया गया है:

ng serve

मैं कंसोल से ऐसा कर सकता हूं:

npx ng serve

यहाँ एक लेख है जिसे मैंने NPX के बारे में लिखा है और जो इसमें गहराई तक जाता है।


2

zxc नोडज के लिए "बंडल एग्जीक्यूटिव" जैसा है। यह उपयोग करने के समान है PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp

2

वही @ अनियमित समाधान स्वीकार किए जाते हैं, लेकिन मछली खोल स्वाद

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end

1

आप direnv का उपयोग भी कर सकते हैं और $ PATH वैरिएबल को केवल अपने वर्किंग फोल्डर में बदल सकते हैं।

$ cat .envrc
> export PATH=$(npm bin):$PATH

1

इस स्क्रिप्ट को अपने में जोड़ें .bashrc। फिर आप coffeeस्थानीय स्तर पर कॉल या किसी भी तरह का कर सकते हैं । यह आपके लैपटॉप के लिए आसान है, लेकिन इसे अपने सर्वर पर उपयोग न करें।

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

नोट : यह लिपि एलियास ऑफ cdकमांड बनाती है, और इसके प्रत्येक कॉल के बाद cdइसे चेक करती है node_modules/.binऔर इसे अपने में जोड़ती है $PATH

नोट 2 : आप तीसरी पंक्ति को बदल सकते हैं NODE_MODULES=$(npm bin);। लेकिन इससे cdकमांड बहुत धीमी हो जाएगी।


1
$(npm bin)हार्डकोडिंग के बजाय उपयोग करें ./node_modules/.bin
bfontaine

हम्म, $(npm bin)प्रत्येक cdकमांड के साथ उपयोग करने में बहुत धीमा लगता है । मैंने कोड को पुनर्स्थापित कर दिया है और इसके लिए एक नोट जोड़ा है।
त्सुतोमु कवामुरा

1

विंडोज के लिए यह प्रयोग करें:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version

0

मुझे एक ही समस्या का सामना करना पड़ा और मुझे विशेष रूप से उपनामों का उपयोग करना पसंद नहीं है (जैसा कि नियमित रूप से सुझाव दिया गया है), और यदि आप उन्हें पसंद नहीं करते हैं, तो यहां एक और समाधान है जिसका मैं उपयोग करता हूं, आपको पहले एक छोटी निष्पादन योग्य बैश स्क्रिप्ट बनानी होगी, कहो setenv.sh :

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

और फिर आप /binइस कमांड का उपयोग करके अपने स्थानीय में किसी भी निष्पादनयोग्य का उपयोग कर सकते हैं :

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

यदि आप scriptspackage.json में उपयोग कर रहे हैं तो:

...,
scripts: {
    'start': './setenv.sh <command>'
}

2
इस setenv स्क्रिप्ट के लिए आवश्यक नहीं है package.json स्क्रिप्ट। npm पहले से ही स्थानीय नोड_modules / .bin निर्देशिका को आपके लिए पथ पर भेज देता है जब npm रन {स्क्रिप्ट} निष्पादित करता है।
jasonkarns

0

मुझे यह जानकर अच्छा लगेगा कि क्या यह एक असुरक्षित / बुरा विचार है, लेकिन इसके बारे में थोड़ा सोचने के बाद मुझे यहाँ एक मुद्दा नहीं दिखता है:

लिनुस के असुरक्षित समाधान को संशोधित करने के लिए इसे जोड़ने के npm binलिए, निर्देशिका खोजने के लिए, और स्क्रिप्ट को केवल npm binतब कॉल करें जब package.jsonकोई अभिभावक (गति के लिए) में मौजूद हो, यह वही है जिसके लिए मैं आया हूं zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

इसके bashबजाय, precmdहुक का उपयोग करने के बजाय , आप $PROMPT_COMMANDचर का उपयोग कर सकते हैं (मैंने इसका परीक्षण नहीं किया है लेकिन आपको विचार मिलता है):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"

npm binअंत में जोड़ना $PATHउपयोगकर्ता निष्पादित नहीं कर सकता है: मूल रूप से एक और निष्पादन योग्य लेकिन संभवतः एक अन्य संस्करण के साथ विश्व स्तर पर स्थापित पैकेज!
लोगानमज़

0

मैं एक Windowsउपयोगकर्ता हूं और यह मेरे लिए काम कर रहा है:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

शुभ लाभ।


0

यदि आप उपयोग कर रहे हैं fish shellऔर $pathसुरक्षा कारणों से नहीं जोड़ना चाहते हैं । हम स्थानीय नोड निष्पादनयोग्य को चलाने के लिए नीचे फ़ंक्शन जोड़ सकते हैं।

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

अब आप चीज़ को चला सकते हैं:

n coffee

या अधिक तर्क जैसे:

n browser-sync --version

ध्यान दें, यदि आप bashउपयोगकर्ता हैं, तो @ Bob9630 उत्तर bash's का लाभ उठाने का तरीका है $@, जो उपलब्ध नहीं है fishshell


-9

पैकेज में कॉफी-स्क्रिप्ट शामिल करें। प्रत्येक प्रोजेक्ट में आवश्यक विशिष्ट संस्करण के साथ, आमतौर पर इस तरह:

"dependencies":{
  "coffee-script": ">= 1.2.0"

फिर प्रत्येक प्रोजेक्ट में निर्भरता स्थापित करने के लिए npm इंस्टॉल करें। यह कॉफी-स्क्रिप्ट के निर्दिष्ट संस्करण को स्थापित करेगा जो प्रत्येक परियोजना के लिए स्थानीय रूप से सुलभ होगा।


हाँ, मुझे अपने प्रश्न में कहा गया है। मैं अपने प्रोजेक्ट में विशेष रूप से कैसे कॉल कर सकता / सकती हूं?
टाइपोनियरर

यदि आपने अपने प्रोजेक्ट के मुख्य फ़ोल्डर में पैकेज.json के साथ npm इंस्टॉल चलाया है, तो आपके पास इस फ़ोल्डर में एक ./node_modules/.bin/cfi फ़ोल्डर होना चाहिए। का उपयोग करते हुए ./node_modules/cfish-script/bin/coff कॉफी का स्थानीय संस्करण चलाएगा जबकि सिर्फ कॉफी चलाने से वैश्विक स्थापना चलेगी। यदि आपके पास इस प्रोजेक्ट फ़ोल्डर के भीतर किसी अन्य पथ में कॉफी का दूसरा संस्करण स्थापित है, तो आप इसका उपयोग कर सकते हैं ।/path/to/this/installation/cfish।
अल्मिपाल

इसने मेरे लिए काम नहीं किया। मैं "svgo" का उपयोग करने की कोशिश कर रहा हूं, और यह केवल तभी काम करता है जब विश्व स्तर पर स्थापित हो। मैंने पैकेज.जॉन के साथ npm install svgoभी कोशिश की है npm install। दोनों तरीके "सफलतापूर्वक" स्थापित हैं, लेकिन "svgo" कमांड अभी भी उपलब्ध नहीं है।
रयान व्हेल

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