यह npm-config उपयोग करने के लिए एक अच्छी जगह हो सकती है।
जब स्क्रिप्ट चला (देखें NPM-स्क्रिप्ट (7)) package.json "config" कुंजी वातावरण में ओवरराइट कर रहे हैं वहाँ <name>[@<version>]:<key>
की एक config परम मैं उन्हें इस्तेमाल नहीं होता है प्रत्येक प्रकार की परिवर्तनीय विन्यास सेटिंग के लिए, लेकिन मुझे लगता है कि यह यूआरएल और बंदरगाहों जैसे साधारण मामलों के लिए एक अच्छा समाधान है क्योंकि:
- आप उन्हें सीधे पैकेज.जेसन में डाल देते हैं।
- इसके अतिरिक्त, आप उन्हें कमांड लाइन या ENV चर के रूप में निर्दिष्ट कर सकते हैं।
- एनपीएम के माध्यम से चलने वाली कुछ भी उन्हें संदर्भित कर सकती है (उदा।, स्क्रिप्ट)।
- आप उन्हें सेट कर सकते हैं प्रति-उपयोगकर्ता `NPM config सेट foo के साथ: पोर्ट 80
एक चेतावनी है कि आपके package.json में config
पैरामीटर केवल स्वचालित रूप से वातावरण में जब आप अपने कोड चलाने निर्यात किया जाता है है एनपीएम के माध्यम से। इसलिए, यदि आप इसे नोड के साथ चलाते हैं, जैसे node ./myapp.js
, तो आप उम्मीद नहीं कर सकते कि process.env.npm_package_config_foo
में आपका मान होगा। हालांकि, आप हमेशा var pkg = require('./package.json');
कर सकते हैं और pkg.config
पर मानों तक पहुंच सकते हैं।
क्योंकि यह तुरंत स्पष्ट नहीं हो सकता है, मैं यह भी जोड़ूंगा कि npm_package_config
पर्यावरण चर आपके एनपीएम पैकेज पर निर्भर ऐप्स तक बुलबुला नहीं करते हैं। इसलिए, यदि आपका निर्भर पैकेज पैकेज process.env.npm_package_config_foo
को संदर्भित करता है, तो आश्रित पैकेज को अपने पैकेज.जेसन में परिभाषित करना होगा। मुझे लगता है कि यह एक "npm_package_config" है क्योंकि यह पेड़ को सभी तरह से धक्का देने के लिए समझ में नहीं आता है।
तो, मैं एक एनपीएम कॉन्फ़िगर चर का उपयोग कैसे करूं और इसे आधार पैकेज और पैकेज पर दोनों पैकेजों में पेड़ के ऊपर कैसे काम करता हूं? यह वास्तव में थोड़ा उलझन में है, और मुझे इसे परीक्षण और त्रुटि के माध्यम से समझना पड़ा।
मान लें कि आपके पास पैकेज कनेक्टर और पैकेज क्लाइंट है। ग्राहककनेक्टर पर निर्भर करता है और आप कनेक्टर कि या इस्तेमाल किया जा सकता ग्राहक में ओवरराइट के लिए एक config पैरामीटर निर्दिष्ट करना चाहते हैं। यदि आप अपने कनेक्टर मॉड्यूल में process.env.npm_package_config.port
का उपयोग करते हैं, तो जब यह क्लाइंट मॉड्यूल पर निर्भर करता है, तो उस चर को निर्यात नहीं किया जाएगा और यह अपरिभाषित के रूप में समाप्त हो जाएगा।
हालांकि, अगर आप के बजाय process.env.npm_config_connector_port
का उपयोग करें (नोटिस पहले एक npm_package_config और npm_config_packagename के साथ अन्य के साथ शुरू होता है), तो आप कम से कम सेट कर सकते हैं कि आपके .npmrc में npm config set connector:port 80
का उपयोग कर और यह "namespaced" हो जाएगा process.env.npm__config_connector_port
हर जगह आप एनपीएम चलाते हैं, जिसमें क्लाइंट पर चलने वाली स्क्रिप्ट्स शामिल हैं जो कनेक्टर पर निर्भर करती हैं, और आप हमेशा अपने एनएनवी में, या अपने .npmrc में कमांड लाइन पर इसे ओवरराइट कर पाएंगे। आपको बस यह ध्यान रखना होगा कि, किसी भी पर्यावरण चर के साथ, यह हमेशा सेट नहीं किया जा सकता है। तो, मैं पहली बार (पसंदीदा) मूल्य के रूप में process.env.npm_config_connector_port
के साथ डिफ़ॉल्ट ऑपरेटर का प्रयोग करेंगे:
var port = process.env.npm_config_connector_port || sane_default
यहाँ, sane_default अन्य सिफारिश से किसी एक पद्धति से भरा जा सकता है। व्यक्तिगत रूप से, मुझे जेएसओएन फाइलों में कम से कम कॉन्फ़िगरेशन डेटा रखना पसंद है, और package.json उन्हें अंदर रखने के लिए सबसे अच्छी JSON फ़ाइल की तरह लगता है। उन्हें कोड के बजाय डेटा में स्टोर करें और फिर आप आसानी से स्थिर JSON का उपयोग कर सकते हैं इन-लाइन, उन्हें गतिशील रूप से उत्पन्न करें, या उन्हें फाइल सिस्टम, यूआरएल या डेटाबेस से खींचें।
मुझे app.js कोड नहीं समझा। मैं config.js में चर सेट करता हूं लेकिन फिर, मैं अपने app.js में उन्हें "पढ़" कैसे सकता हूं? – donald
./config.js में अंतिम पंक्ति आपको उस कोड को आपके ./app.js फ़ाइल में निर्यात करने की अनुमति देती है। ./config.js आपके पर्यावरण के आधार पर उचित जेसन ऑब्जेक्ट देता है, और उसके बाद आप उस जेसन ऑब्जेक्ट पर वेरिएबल सीएफजी सेट करते हैं। हालांकि, एक गलती। config.something सीएफजी होना चाहिए।कुछ क्योंकि यह उस चर का नाम है जिसे आप बना रहे हैं। –
सुनिश्चित करें कि आपने अपने उत्पादन सर्वर पर 'NODE_ENV' कॉन्फ़िगरेशन चर सेट किया है। Heroku के साथ यह 'heroku कॉन्फ़िगरेशन होगा: NODE_ENV = उत्पादन' सेट करें। ऐसा करने के बिना, 'config.js' की अंतिम पंक्ति काम नहीं करेगी। –