2015-02-01 10 views
5

को देखते हुएरैपिंग

3 Node.js की आवश्यकता होती है परियोजनाओं मुख्य - फ्रेमवर्क - डेटा संग्रह स्थान

मुख्यNPM लिंक के माध्यम से जुड़े दो अन्य परियोजनाएं हैं।

एक परीक्षण में मैंने एक विधि में आवश्यकताएं लपेट लीं। मैं जुड़ा हुआ परियोजनाओं को हल करने में कुछ समस्याएं मिल गया है (विवरण नीचे देखें)

सरलीकृत कोड इस तरह दिखता है:

module.export.resolve = function(file){ 
[...]//Some more logik to handle relative pathes 
return require(file) 
} 

यह सबसे स्थितियों में ठीक काम करता है। मैं भी रिश्तेदारों pathes (फोन करने वाले के लिए देख रही है और इस मार्ग के आधार पर pathes लागू)

अब इस परियोजना की रूपरेखा जो परियोजना मुख्य से जुड़ा हुआ है (NPM लिंक) में है के साथ संभाला करने के लिए बाहर काम किया। परियोजना मुख्य में भी परियोजना रिपोजिटरीज जुड़ा हुआ है।

अब परियोजना में मुख्य मेरे पास है:

require('ProjectRepositories/foo') // Works as expected 
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo' 

मुझे लगता है समस्या यह है कि डेटा संग्रह स्थान परियोजना IST फ्रेमवर्क परियोजना में जुड़ा हुआ नहीं है। लेकिन क्या उन्हें जोड़ने से कोई दूसरा तरीका है?

मैं कम निर्भरता रखना पसंद करूंगा। उस पर कोई संकेत?

+0

यह मेरी पूरी संरचना स्पष्ट नहीं है कि आपकी संरचना कैसी दिखती है। क्या आप स्पष्टीकरण दे सकते हैं? इस बीच, क्या आप जानते थे कि आपके पास ['NODE_PATH'] हो सकता है (https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) env var? – gustavohenke

+0

आप कहते हैं "अपेक्षित काम करता है" लेकिन आप यह नहीं कहते कि यह क्या लौटाता है। तो, यह वही वापस आ सकता है। जो आपने पोस्ट किया है, वह वही करता है, सिवाय इसके कि आपने अतिरिक्त तर्क लिखा है जो वास्तव में आयात की आवश्यकता के लिए गड़बड़ कर सकता है। यदि आप एक समाधान 2 फ़ंक्शन करते हैं जो सीधे 'आवश्यकता (फ़ाइल)' देता है, तो इसे आपके प्रत्यक्ष 'आवश्यकता (' ProjectRepos/foo ')' आमंत्रण के रूप में ठीक से काम करना चाहिए। तो आप शायद निष्कर्ष निकालेंगे कि आपका कस्टम तर्क वास्तव में है जहां त्रुटि झूठ है, मुझे लगता है। – EricG

उत्तर

1

आपको लगता है कि में बिल्कुल सही कारण है कि परियोजना की रूपरेखाresolve काम नहीं करता क्योंकि requireFn कि इस परियोजना केवल उस ढांचे में स्थापित मॉड्यूल के बारे में जानता भीतर से इस्तेमाल किया जा रहा है कर रहे हैं। ऐसा इसलिए है क्योंकि जब आप require एक जावास्क्रिप्ट फ़ाइल करते हैं, तो नोड मॉड्यूल के context के भीतर स्क्रिप्ट का मूल्यांकन करता है, और वर्तमान प्रोजेक्ट का संदर्भ नहीं (इस प्रकार निर्भरता मॉड्यूल 'require एस आपकी शीर्ष-स्तरीय स्क्रिप्ट से काम करता है)।

क्या आप कर सकते हैं करते हैं, तथापि, ढांचा समाधानकर्ता का उपयोग करने के लिए एक तरीका प्रदान करता है एक उपयोगकर्ता द्वारा निर्दिष्ट, अपने काम करने के लिए एक बार यह रास्तों को बदल दिया है समारोह की आवश्यकता है।

module.exports.resolve = function(file, resolver) { 
    //Some more logik to handle relative pathes 
    resolver = typeof resolver == 'function' ? resolver : require; 
    return resolver(file) 
} 

अब अपने कोड में, आप

myRequire.resolve('ProjectRepositories/foo', require); 

तो अब आपके परियोजना मुख्य आवश्यकता फ़ाइल को हल करने में इस्तेमाल किया जाएगा कर सकता है।

यदि आप चाहते हैं और मॉड्यूल को स्टेटफुल करें और इसे हल करने वाले रिज़ॉल्यूवर को याद रखें तो आप इसे एक कदम आगे भी ले सकते हैं।

var _requireFn = require; 

module.exports = { 
    resolve: resolve, 
    setRequireFn: setRequireFn 
}; 

function resolve(path) { 
    return _requireFn(path); 
} 

function setRequireFn(requireFn) { 
    _requireFn = requireFn; 
} 

एक और नोट पर, मैं, आवश्यक होने की वजह से नोड कि शब्दार्थ के लिए प्रयोग किया जाता है सही फ़ाइल पथ को देख में अवधि resolve उपयोग के बारे में सावधान रहना होगा एक ला require.resolve

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

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