2011-12-21 20 views
12

पर कॉफ़ीस्क्रिप्ट संकलित करना मैं कॉफीस्क्रिप्ट में निर्मित private npm repos से युक्त एक ऐप बना रहा हूं। तैनाती भाषा-अज्ञेयवादी रखने के लिए, और प्रत्येक ऐप को कॉफीस्क्रिप्ट के अपने संस्करण को निर्दिष्ट करने की अनुमति दें, मैं प्रत्येक पुस्तकालय में निर्भरता के रूप में कॉफीस्क्रिप्ट और एनपीएम स्थापना पर जावास्क्रिप्ट में निर्माण कर रहा हूं।एनपीएम इंस्टॉल

एनपीएम इंस्टॉलेशन स्टैंडअलोन रिपोज़ के लिए ठीक काम करता है, लेकिन जब मैं एक रेपो इंस्टॉल करने का प्रयास करता हूं तो विफल रहता है जो कि एक और रेपो बनने पर निर्भर करता है।

तो अगर मैं repo-a, जिनकी राशि package.json इसमें शामिल हैं:

"dependencies": { 
    "coffee-script": "~1.2.0" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

और repo-b, जिसका package.json शामिल करें:

"dependencies": { 
    "coffee-script": "~1.2.0", 
    "repo-a": "git+ssh://[email protected]:myrepo.git" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

जहां दोनों एक Cakefile है कि इस तरह दिखता है, एक install साथ एनपीएम install हुक पर कॉल किया गया कार्य:

के लिए के लिए

npm install काम करता है, लेकिन इस संदेश के साथ repo-b के लिए विफल रहता है:

sh: ./node_modules/coffee-script/bin/cake: No such file or directory 

जबकि किसी अधूरा ___coffee-script.npm निर्देशिका node_modules में मौजूद है।

बेशक app.js wrapper का उपयोग करना अधिक आसान होगा, लेकिन मुझे कॉफीस्क्रिप्ट नहीं, बल्कि जावास्क्रिप्ट को तैनात करने की आवश्यकता है। क्या कोई मुझे बता सकता है कि मैं इसे कैसे काम कर सकता हूं?

+0

, इस दृष्टिकोण से काम करता है जब मैं पर भरोसा करते हैं पर हैं एक वैश्विक 'केक' बाइनरी, और केवल विफल रहता है क्योंकि मैं स्थानीय रूप से स्थापित 'केक' निर्दिष्ट कर रहा हूं। –

उत्तर

9

दो चीजें।

  1. आप एक NPM आदेश से केक चला रहे हैं, तो आप सिर्फ cake install या cake build scripts.install क्षेत्र के रूप में निर्दिष्ट कर सकते हैं। यह चलाएगा कॉफी-स्क्रिप्ट स्थानीय रूप से स्थापित किया गया है, और इसकी बिन उचित रूप से (विंडोज़ पर एक शिम के साथ) जुड़ा हुआ है, और एक पाथ वातावरण के साथ चलाएगा जैसे कि स्थानीय रूप से स्थापित cake सिस्टम पथ में किसी और चीज़ के बजाए उपयोग किया जाता है ।
  2. आप नहीं एक NPM आदेश से चल रहे हैं, लेकिन आप फिर भी उम्मीद कर रहे हैं कि कॉफी स्क्रिप्ट पहले से ही NPM (जो यह तरह दिखता है) के माध्यम से स्थानीय स्तर पर स्थापित किया गया है, तो आप शायद ./node_modules/.bin/cake या ./node_modules/.bin/coffee बल्कि मार किया जाना चाहिए पैकेज आंतरिक में डाइविंग से।

आप NPM के साथ कॉफी स्क्रिप्ट स्थापित करने नहीं कर रहे हैं, लेकिन इसके बजाय कुछ Git submodules या कुछ का उपयोग कर, तो आप अपने खुद :)

क्या इसके लायक है के लिए
+1

बहुत धन्यवाद, आईएसएएसी। मुझे एनबीएम के दायरे को 'बिन' तक बढ़ाया नहीं गया, यह शानदार खबर है। जितना अधिक मैं "उपकरण को एनपीएम" के बारे में सीखता हूं (जैसा कि "रेपो के रेपो" एनपीएम के विपरीत) जितना अधिक मैं इसे प्यार करता हूं। यह सॉफ्टवेयर का एक बड़ा टुकड़ा है। –

+1

'node_modules/.bin/'से' पथ '(1.) में वास्तव में साफ है क्योंकि हम नियमित रूप से node_module की बाइनरी का उपयोग कर सकते हैं। इस अद्भुत चाल को साझा करने के लिए धन्यवाद! – abernier

4

मैं स्थानीय रूप से जेएस बनाने और संकलित संकुल को tar.gz फ़ाइलों को एस 3 पर स्टोर करने की सलाह दूंगा। स्थानीय विकास के लिए आप npm link और उत्पादन में आप संग्रह यूआरएल को इंगित कर सकते हैं। यदि आप अपनी निर्भरताओं का संस्करण नहीं बनाना चाहते हैं तो आप एक ही यूआरएल को अद्यतन कर सकते हैं।

इस एनपीएम बग को ध्यान में रखें: https://github.com/isaacs/npm/issues/1727 (जब भी आप एप पर डीपी अपडेट करते हैं तो आपको मूल रूप से अपने नोड_मोड्यूल फ़ोल्डर को मिटा देना होगा जो संस्करण संख्या के रूप में गिट/http यूआरएल का उपयोग करता है)।

--fg

+0

बहुत बढ़िया, पॉइंटर्स के लिए धन्यवाद, फ़ेलिक्स। मुझे लगता है कि मैं अब [@ jashkenas के समाधान] (http://twitter.com/jashkenas/status/149516518802198528) के साथ जा रहा हूं, और प्रदान किए गए मॉड्यूल से आदेशों के बिना संकलित करूँगा। –

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