कैसे पैकेज.json के भीतर से पर्यावरण चर सेट करने के लिए


313

आदेशों के package.jsonसाथ उपयोग किए जाने वाले भीतर से कुछ पर्यावरण चर कैसे सेट करें npm start?

यहाँ वर्तमान में मेरे पास क्या है package.json:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

मैं NODE_ENVअभी भी स्क्रिप्ट में वातावरण चर (जैसे ) सेट करना चाहता हूं, जबकि अभी भी केवल एक कमांड के साथ एप्लिकेशन को शुरू करने में सक्षम है npm start


आप इस उत्तर को पढ़ सकते हैं stackoverflow.com/a/57509175/11127383
डैनियल डेनिलेकी

जवाबों:


433

स्क्रिप्ट कमांड में पर्यावरण चर सेट करें:

...
"scripts": {
  "start": "node app.js",
  "test": "env NODE_ENV=test mocha --reporter spec"
},
...

फिर process.env.NODE_ENVअपने ऐप में उपयोग करें।

नोट: envयह सुनिश्चित करता है कि यह प्लेटफार्मों भर में काम करता है। यदि आप केवल मैक / लिनक्स की परवाह करते हैं तो आप इसे छोड़ सकते हैं।


65
क्या किसी ने खिड़कियों के लिए एक विकल्प तैयार किया है ..?
अनंत 12

65
@ इनफिनिटी क्रॉस-एनवी का उपयोग करते हैं और उपयोग करना बहुत आसान है।
माइककीडर

106
@ इनफिनिटी का उपयोग set NODE_ENV=test&& mocha --reporter spec- उद्देश्य पर परीक्षण और && के बीच कोई स्थान नहीं है।
जेमी पेनी

18
"test": "NODE_ENV=test mocha --reporter spec"विंडोज सिस्टम पर काम नहीं करेगा।
बेनी नेउगेबॉउर

7
@infinity @ जैमी-पेनी env NODE_ENV=test mocha --reporter specमूल रूप से क्रॉस प्लेटफॉर्म फैशन में घोषित पर्यावरण चर का उपयोग करेगा, लेकिन कुंजी यह है कि इसका उपयोग npm द्वारा एक तदर्थ और वन-टाइम फैशन में किया जाता है, बस npm स्क्रिप्ट निष्पादन के लिए। (यह भविष्य के संदर्भ के लिए सेट या निर्यात नहीं किया गया है।) जब तक आप npm स्क्रिप्ट से अपनी कमांड चला रहे हैं, तब तक कोई समस्या नहीं है। साथ ही, इस तरह से करते समय "&&" को हटा दिया जाना चाहिए।
एस्टेप्लस

219

बस एनपीएम पैकेज क्रॉस-एनवी का उपयोग करें । सुपर आसान है। विंडोज, लिनक्स और सभी वातावरणों पर काम करता है। ध्यान दें कि आप अगले कार्य में जाने के लिए && का उपयोग नहीं करते हैं। आप बस एनवी सेट करते हैं और फिर अगला कार्य शुरू करते हैं। यहाँ टिप्पणियों में से एक सुझाव के लिए @mikekidder को श्रेय ।

प्रलेखन से:

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

ध्यान दें कि यदि आप कई वैश्विक संस्करण सेट करना चाहते हैं, तो आप उन्हें उत्तराधिकार में राज्य देते हैं, उसके बाद आपकी कमांड निष्पादित होती है।

अंततः, कमांड जो निष्पादित (स्पॉन का उपयोग करके) है:

webpack --config build/webpack.config.js

NODE_ENVवातावरण चर पार env द्वारा निर्धारित किया जाएगा


ट्रिपल बैकस्लैश का उपयोग आवश्यक उद्धरणों से बचने के लिए किया जा सकता है:"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
bvj

1
सबसे अच्छा समाधान क्योंकि पार मंच।
बर्नार्डन

क्या कोई अंत में मुझे यह तय करने में मदद कर सकता है कि मुझे इसका उपयोग करना चाहिए envया cross-env? एक तरफ, env मुझे कुछ भी स्थापित करने की आवश्यकता नहीं है और दूसरी तरफ cross-envअधिक लोकप्रिय है। क्या envसभी प्लेटफ़ॉर्म पर काम करने की पुष्टि कोई कर सकता है?
ऋषव

2
@ रिशव envसभी प्लेटफार्मों पर काम नहीं कर रहा है, इसलिए इसके cross-envअस्तित्व का कारण है। बस उपयोग करें cross-envऔर इसके साथ किया जाए।
तेतद्रदेव

37

मैं सिर्फ भविष्य के नोड-खोजकर्ताओं के लिए यहां अपने दो सेंट जोड़ना चाहता था। मेरे Ubuntu १४.०४ में NODE_ENV=testकाम नहीं किया, मुझे इसके export NODE_ENV=testबाद NODE_ENV=testकाम करना शुरू कर दिया, जो अजीब था।

विंडोज पर जैसा कि कहा गया है कि आपको उपयोग करना है, set NODE_ENV=testलेकिन क्रॉस-प्लेटफॉर्म समाधान के लिए क्रॉस-एनवी लाइब्रेरी चाल नहीं लगती है और क्या आपको वास्तव में ऐसा करने के लिए पुस्तकालय की आवश्यकता है:

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

वर्टिकल बार की जरूरत होती है, अन्यथा विंडोज बिना पहचानी गई export NODE_ENVकमांड पर क्रैश हो जाएगी : डी। दुनो पीछे चल रही जगह के बारे में लेकिन यकीन है कि मैं उन्हें भी हटा दिया।


6
क्या आपने उपयोग किया &&? NODE_ENV=test yaddaइसका मतलब है "रन yadda, की स्थापना NODE_ENVके भीतर yadda। वातावरण चर के NODE_ENV=test && yaddaअर्थ है" सेट NODE_ENVस्थानीय पर्यावरण के भीतर है, लेकिन निर्यात नहीं है यह, तो चलाने yadda"। NODE_ENV=test yaddaपसंदीदा तरीका है।
जोश केली

क्षमा करें, जिसने कुछ समय में मेरे स्टैकओवरफ़्लो खाते की जाँच नहीं की है। लेकिन मूल रूप से मूर्खतापूर्ण विंडोज का उपयोग NODE_ENV=test && npm run testया कुछ इसी तरह का काम नहीं किया । मैंने process.env["NODE_ENV"] = "testing";अपनी testhelper.js फ़ाइल के अंदर उपयोग करके एक बेहतर समाधान बनाया ।
तेमुके

5
@TeemuK केवल मेरे दो सेंट जोड़ने के लिए, जब आप अपने कमांड को चलाते हैं तो आप &&अपने पर्यावरण चर खो देते हैं, केवल वर्तमान कमांड पर निर्यात कार्यों के बिना पर्यावरण चर सेट करते हैं (जो कुछ भी नहीं है)। यू निर्यात के बिना एनवी चर के साथ कमांड चलाने के लिए NODE_ENV=test npm run test:। आपके द्वारा निर्यात किए जाने के बाद अंत में इसका कारण यह है, क्योंकि उर चर अब सत्र में उपलब्ध (निर्यात) है, निर्यात के बिना आपका NODE_ENV कुछ भी नहीं कर रहा है।
तारेक

37

क्योंकि मैं अक्सर खुद को कई पर्यावरण चर के साथ काम करते हुए पाता हूं, इसलिए मुझे उन्हें एक अलग .envफाइल में रखना उपयोगी लगता है (अपने स्रोत नियंत्रण से इसे अनदेखा करना सुनिश्चित करें)।

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

फिर export $(cat .env | xargs) &&अपनी स्क्रिप्ट कमांड से पहले प्रस्तुत करें।

उदाहरण:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

परीक्षण के लिए आप रन npm run env(linux) या npm run env-windows(विंडोज़) द्वारा env वेरिएबल्स देख सकते हैं ।


बहुत अच्छा, यह लगभग मेरे लिए काम किया! मैं कुछ टिप्पणियां जोड़ना चाहूंगा: - आपकी .env फ़ाइल में खाली लाइनें नहीं हो सकती हैं - आपकी .env फ़ाइल में टिप्पणियां आपकी स्क्रिप्ट को तोड़ देंगी - यदि कई स्क्रिप्ट एक ही .env फ़ाइल का उपयोग करती हैं, तो आपको उसे दोहराना होगा - मुझे &&काम करने के लिए पहले स्थान को हटाना पड़ा - यदि आपके पास कई .env फाइलें हैं, तो इस सुझाव को तैयार करने के लिए प्रेरित करने के लिए आपको थोड़ा मुश्किल हो सकता है: इस सुझाव को तैयार करने के लिए मुझे प्रेरित किया गया: stackoverflow.com/questions/25112510/…
Felipe Noura

19

इसे बदलकर Windows पर आज़माएँ YOURENV:

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV && tagove help",
       "start": "set NODE_ENV=YOURENV && tagove start"
     }
    ...
  }

1
हाँ! धन्यवाद! यह वह उत्तर था जिसकी मुझे तलाश थी! : डी
डैनियल टोनन

6
मुझे && से पहले स्पेस हटाना था।
केनेथ सोलबर्ग

@ केनेथसोलबर्ग की टिप्पणी अंतिम स्पर्श थी जिसने इसे मेरे लिए काम किया (केवल विंडोज)
ulu

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

8

अचानक मैंने पाया कि एक्शनरो निम्नलिखित कोड का उपयोग कर रहा है, जिसने मेरी समस्या को केवल --NODE_ENV=productionस्क्रिप्ट कमांड विकल्प में पारित करके हल किया है।

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

मैं वास्तव में किसी ऐसे व्यक्ति के उत्तर को स्वीकार करना चाहूंगा, जो पैकेज / जसन या इनिट स्क्रिप्ट में पर्यावरण चर को सेट करने के लिए अधिक बेहतर तरीका जानता है, या ऐसा कुछ, जहां ऐप किसी और द्वारा बूटस्ट्रैप किया गया हो।


4

पर्यावरण चर के एक बड़े सेट के लिए या जब आप उन्हें फिर से उपयोग करना चाहते हैं env-cmd

./.env फ़ाइल:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

./package.json:

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

आप स्क्रिप्ट में ENV1 का उपयोग कैसे करते हैं?
वल्बर डेब

सामान्यprocess.env.ENV1
KARASZI इस्तवान

लेकिन, package.json के अंदर? मैंने पढ़ा था कि यह असंभव है (?)
ValRob

मुझे समझ नहीं आ रहा है। तुम ऐसा क्यों करोगे?
करसजी इस्तवान

हो सकता है कि यह एक मूर्ख-सहयोगी है, लेकिन मैंने मैको कैटालिना को अपडेट किया था और अब कमांड मोंगोडब काम नहीं कर रहा है, इसलिए मुझे डेटा / फ़ोल्डर को निर्दिष्ट करने की आवश्यकता है mongod --dbpath ~/data/db। मैं कुछ ऐसा चलाना चाहता हूं npm mongodbऔर वह पर्यावरण चर dbpath प्राप्त करेगा और हमेशा की तरह मानदंड चलाएगा ... और .. मैं इसे अन्य सदस्यों के साथ साझा करना चाहता हूं।
वालरॉब

2

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

मेरे सभी परिदृश्य पर, मैं चाहता था, मूल रूप से, JWT प्रमाणीकरण (विकास उद्देश्यों के लिए) के साथ सर्वर को सुरक्षित करने के लिए एक चर सेट करने के लिए

उत्तर को पढ़ने के बाद मैंने केवल 2 अलग-अलग फाइलें बनाने का फैसला किया, प्रमाणीकरण के साथ क्रमशः चालू और बंद।

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

फाइलें केवल मूल इंडेक्स.जेएस फाइल (जिसे मैंने नाम दिया गया है appbootstrapper.js) को कॉल करने वाले रैपर हैं :

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

शायद यह किसी और की मदद कर सकता है



2

यह विंडोज कंसोल में काम करेगा :

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

उत्पादन: test

देखें इस उत्तर जानकारी के लिए।


5
होना चाहिए set TMP=test&& npm run bbb। पहले वाला स्थान &&भी तब NODE_ENVस्ट्रिंग के भाग के रूप में बंद हो जाएगा
FisNaN

यदि आप इसे उद्धरणों से घेरते हैं तो @FisNaN मामला नहीं होना चाहिए "
कैसर

1

आपको ईएनवी चर सेट नहीं करना चाहिए package.json। एक्शनेरो NODE_ENVआपको कॉन्फ़िगरेशन विकल्पों को बदलने की अनुमति देता है जो फाइलों में से लोड किए गए हैं ./config। की जाँच करें redis कॉन्फ़िग फ़ाइल , और देखते हैं कि NODE_ENV में परिवर्तन डेटाबेस के विकल्प के लिए उपयोग करता है हैNODE_ENV=test

यदि आप चीजों को (शायद HTTP पोर्ट) सेट करने के लिए अन्य ENV चर का उपयोग करना चाहते हैं, तो भी आपको कुछ भी बदलने की आवश्यकता नहीं है package.json। उदाहरण के लिए, यदि आप PORT=1234ईएनवी में सेट करते हैं और इसे HTTP पोर्ट के रूप में उपयोग करना चाहते हैं NODE_ENV=production, तो प्रासंगिक कॉन्फिगर फाइल में संदर्भ दें: IE:

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

महान। मुझे लगता है कि आपने मेरा प्रश्न नहीं पढ़ा है .. मेरी समस्या यह है कि NODE_ENV कैसे सेट किया जाए, इसका क्या उपयोग है।
dev.meghraj

1
यदि आप कई पर्यावरण गुण सेट करना चाहते हैं तो आप इसे npm startकमांड में नहीं करते हैं । ऊपर स्निपेट का उपयोग करते हुए, यदि आप ईएनवी पोर्ट का उपयोग करके अपना सर्वर चलाना चाहते थे तो यह होगा export PORT=1234; npm start:। आप जितनी जरूरत हो उतने ईएनवी घोषणाओं को संलग्न कर सकते हैं, लेकिन वे पैकेज.जॉन फ़ाइल में नहीं हैं। यदि आप यह सुनिश्चित करने के बारे में चिंतित हैं कि वे मौजूद हैं तो आपको अपनी कॉन्फ़िग फ़ाइल में चूक का उपयोग करना चाहिए port: process.env.PORT || 8080:।
टोनी

1
शायद यह समझाने का एक वैकल्पिक तरीका यह होगा कि NODE_ENV (और अन्य पर्यावरण चर) पर्यावरण का हिस्सा हैं (इसलिए नाम)। वे आम तौर पर सर्वर के गुण होते हैं जिन्हें आप अपने एप्लिकेशन के बजाय एप्लिकेशन चला रहे होते हैं। आप उन्हें मैन्युअल रूप से आपके द्वारा निष्पादित कमांड के माध्यम से सेट कर सकते हैं, अर्थात: NODE_ENV=test npm startया उन्हें शेल द्वारा सेट किया गया है
इवान

3
मैं असहमत हूं। प्रत्येक वातावरण के लिए ./config का उपयोग करने से आप अपने एप्लिकेशन को तैनात करते समय स्थैतिक वातावरण का उपयोग करने के लिए परिभाषित करते हैं। यह एक पुराना दर्शन है जो आपको ज़रूरत पड़ने पर नए प्रकार के वातावरण में घूमने की अनुमति नहीं देगा। IE आपको चाहिए हर नए वातावरण के लिए, आपको एक .config जोड़ना होगा। जब आपके टेक स्टैक को अधिक लचीलेपन की आवश्यकता होती है, तो रनवे पर पर्यावरण चर सेट करना एक बेहतर विकल्प हो सकता है। मुझे लगता है कि आपका ./config पर्यावरण के "प्रकार" को स्थापित करने के लिए अच्छा होगा, लेकिन यदि आप रन टाइम पर dsn स्ट्रिंग्स और एपी एंडपॉइंट जैसी चीजों को परिभाषित कर सकते हैं, तो आपका ऐप अधिक लचीला होगा।
जेसी ग्रीथहाउस

@JesseGreathouse - मेरे पास एक नोड.जेएस एप्लिकेशन है और मुझे रनवे पर पर्यावरण चर सेट करने की आवश्यकता है - मैं उन्हें किस फ़ाइल में सेट करूंगा?
रोजर डोजर

1

NPM (और धागे) गुजरता एक बहुत वातावरण चर के रूप में स्क्रिप्ट में package.json से डेटा की। npm run envउन सभी को देखने के लिए उपयोग करें । यह https://docs.npmjs.com/misc/scripts#environment में प्रलेखित है और यह न केवल "जीवनचक्र" लिपियों के लिए है, prepublishबल्कि इसके द्वारा निष्पादित किसी भी लिपि के लिए भी है npm run

आप इन्हें इनसाइड कोड (जैसे process.env.npm_package_config_portJS) में एक्सेस कर सकते हैं, लेकिन वे पहले से ही स्क्रिप्ट चलाने वाले शेल के लिए उपलब्ध हैं ताकि आप उन्हें $npm_..."स्क्रिप्ट" (यूनिक्स सिंटैक्स में विस्तार के रूप में भी एक्सेस कर सकें , विंडोज़ पर काम नहीं कर सकते?)।

"Config" खंड इस उपयोग के लिए लगता है:

  "name": "myproject",
  ...
  "config": {
    "port": "8010"
  },
  "scripts": {
    "start": "node server.js $npm_package_config_port",
    "test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
  } 

इन "कॉन्फ़िगर" फ़ील्ड का एक महत्वपूर्ण गुण यह है कि उपयोगकर्ता उन्हें संकुल को संशोधित किए बिना ओवरराइड कर सकते हैं

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8010

$ npm config set myproject:port 8020
$ git diff package.json  # no change!
$ cat ~/.npmrc
myproject:port=8020

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8020

देखें NPM config और यार्न config डॉक्स।
ऐसा प्रतीत होता है कि यार्न पढ़ता है ~/.npmrcइसलिए npm config setदोनों को प्रभावित करता है, लेकिन yarn config setलिखता है ~/.yarnrc, इसलिए केवल यार्न इसे देखेंगे :-(


1

@ ल्यूक का जवाब लगभग वही था जिसकी मुझे ज़रूरत थी! धन्यवाद।

जैसा कि चयनित उत्तर बहुत सीधा (और सही) है, लेकिन पुराना है, मैं आपकी स्क्रिप्ट चलाते समय एक अलग .env फ़ाइल से चर आयात करने और ल्यूक के उत्तर की कुछ सीमाओं को ठीक करने के लिए एक विकल्प प्रदान करना चाहूंगा। इसे इस्तेमाल करे:

::: .vv फ़ाइल :::

# This way, you CAN use comments in your .env files
NODE_PATH="src/"

# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"

फिर, अपने पैकेज जसन में, आप एक स्क्रिप्ट बनाएंगे जो चर सेट करेगी और स्क्रिप्ट को आपकी ज़रूरत से पहले चलाएगी:

::: package.json :::

scripts: {
  "set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
  "storybook": "npm run set-env && start-storybook -s public"
}

कुछ अवलोकन:

  • ग्रीप्ड कैट कमांड में नियमित अभिव्यक्ति टिप्पणियों और खाली लाइनों को साफ कर देगी।

  • &&होने की जरूरत नहीं है "चिपके" के npm run set-envरूप में यह अगर आप एक ही आदेश में चर की स्थापना कर रहे थे की आवश्यकता होगी।

  • यदि आप यार्न का उपयोग कर रहे हैं, तो आपको एक चेतावनी दिखाई दे सकती है, आप या तो इसे बदल सकते हैं या इसके बजाय yarn set-envउपयोग कर सकते हैं npm run set-env --scripts-prepend-node-path &&

विभिन्न वातावरण

इसका उपयोग करते समय एक और लाभ यह है कि आपके पास विभिन्न पर्यावरण चर हो सकते हैं।

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

कृपया, याद रखें कि जब आपके पास चाबियाँ, पासवर्ड या समझदार / व्यक्तिगत डेटा हों, तो अपने git रिपॉजिटरी में .env फ़ाइलों को न जोड़ें!


1

खिड़कियों में गिट बश का उपयोग करें। Git Bash प्रक्रिया cmd से भिन्न रूप से कमांड करती है।

जब आप NODE_ENV = जैसे उत्पादन के साथ पर्यावरण चर सेट करते हैं, तो अधिकांश विंडोज़ कमांड संकेत देगा। (अपवाद विंडोज पर बैश है, जो देशी बैश का उपयोग करता है।) इसी तरह, इसमें एक अंतर है कि विंडोज़ और पॉसएक्स कमांड कैसे उपयोग करते हैं। POSIX के साथ, आप उपयोग करते हैं: $ ENV_VAR और खिड़कियों पर आप% ENV_VAR% का उपयोग करते हैं। - क्रॉस-एनव डॉक

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

env चर घोषित करने के लिए dotenv पैकेज का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.