Makefile में चाइल्ड प्रोसेस के पर्यावरण चर को कैसे सेट करें


135

मैं इस बदलाव को बदलना चाहूंगा:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test:
    NODE_ENV=test mocha         \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

सेवा:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test: NODE_ENV=test
test:
    mocha                   \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

दुर्भाग्य से दूसरा काम नहीं करता है (नोड प्रक्रिया अभी भी डिफ़ॉल्ट रूप से चलती है NODE_ENV

मुझसे क्या छूट गया?

जवाबों:


153

बनाने चर प्रक्रियाओं के वातावरण में निर्यात नहीं कर रहे हैं ... बनाओ डिफ़ॉल्ट रूप से। हालाँकि आप मेक का उपयोग करने के exportलिए उन्हें ऐसा करने के लिए मजबूर कर सकते हैं । परिवर्तन:

test: NODE_ENV = test

इसके लिए:

test: export NODE_ENV = test

(यह मानते हुए कि आपके पास GNU मेक> = 3.77 का पर्याप्त आधुनिक संस्करण है)।


3
मेरे पास जीएनयू 3.81 है, और all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>पहली पंक्ति के लिए सही विस्तार करता है, लेकिन केवल echoदूसरे के लिए। PROJ_ROOTरन बनाने के बाद सेट नहीं किया जाता है। चारों ओर रिक्त स्थान =निर्यात के लिए "खराब चर नाम" देते हैं। आपके उदाहरण के रूप में शर्त के रूप में पहली पंक्ति होने से "कमांड्स पहले लक्ष्य से पहले शुरू होता है"
Gauthier

8
@ गौथियर हां बिल्कुल। ऐसा मैंने नहीं लिखा। आपने एक <\ n \ t> के बाद जोड़ा all:, जो मेरे उदाहरण में नहीं है। मेरा उदाहरण लिखित रूप में उपयोग करने का इरादा है: यह लक्ष्य-विशिष्ट चर को परिभाषित कर रहा है, नुस्खा में एक कमांड नहीं जोड़ रहा है। इसके अलावा, आप एक ही समय में एक लक्ष्य पर एक नुस्खा और लक्ष्य-विशिष्ट चर का उपयोग नहीं कर सकते हैं: आपको दो बार लक्ष्य लिखना होगा। प्रश्न में दूसरा उदाहरण देखें, और एक नया प्रश्न पूछें यदि यह समझाने में मदद नहीं करता है: टिप्पणियों में पर्याप्त स्थान या प्रारूपण नहीं है।
मैडिसटिसिस्ट

1
कई चर के बारे में क्या?
बजे

1
यह ठीक है लेकिन आपके लक्ष्य में इसे जोड़ा गया है। सिर्फ लक्ष्य के संदर्भ में उन्हें सूचीबद्ध करने से काम नहीं चलेगा? क्योंकि यह मेरे लिए काम नहीं करता है
होम्स

2
लक्ष्य-विशिष्ट चर GNU मेक 3.77 में जोड़े गए थे। वे निर्यात योग्य हैं क्योंकि GNU 3.81 बनाते हैं। देखें git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

79

जैसा कि मैडिसिन्टिस्ट ने बताया , आप अलग-अलग चर का निर्यात कर सकते हैं:

export MY_VAR = foo  # Available for all targets

या किसी विशिष्ट लक्ष्य ( लक्ष्य-विशिष्ट चर ) के लिए चर निर्यात करें :

my-target: export MY_VAR_1 = foo
my-target: export MY_VAR_2 = bar
my-target: export MY_VAR_3 = baz

my-target: dependency_1 dependency_2
  echo do something

आप .EXPORT_ALL_VARIABLESलक्ष्य को निर्दिष्ट भी कर सकते हैं - आपने यह अनुमान लगाया है!

.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3

देखें .EXPORT_ALL_VARIABLES


2
ताज्जुब की बात है कि मैंने पहले यह परीक्षण किया था कि यह दिखाया काम किया है .. (निश्चित रूप से अब क्यों नहीं ..) मैं वापस जा सकता हूं और मेरे द्वारा की गई टिप्पणी को हटा सकता हूं ..
एंथनी

3
@ एंथनीसी यह काम करता है क्योंकि दो MY_VARएस होते हैं: एक मेफाइल वैरिएबल के रूप में एक्सेस किया जाता है ${MY_VAR}और दूसरा एक बैश एक्सपोर्टेड वैरिएबल है, जिसे एक्सेस किया जाता है$$MY_VAR
सर्गेई

उपयोगी। लेकिन केवल चर का एक सेट निर्यात करने का एक तरीका नहीं मिल सकता है।
एरिक चेन

15

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

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/

6
कृपया कुछ स्पष्टीकरण शामिल करने के लिए अपने उत्तर को संपादित करें। कोड-केवल उत्तर भविष्य के एसओ पाठकों को शिक्षित करने के लिए बहुत कम करते हैं। आपका जवाब निम्न-गुणवत्ता होने के लिए मॉडरेशन कतार में है।
मिकमैकुसा

थोरसुमोनर, यह समाधान ऊपर के दृष्टिकोण जितना लचीला नहीं है। उदाहरण के लिए, किसी को कमांड लागू करने के लिए एक एकल नियम और फिर कई अन्य नियम हो सकते हैं जो पर्यावरण चर को सेट करके उस व्यवहार को संशोधित करते हैं। विचार करें: परीक्षण: cmd perf: निर्यात PERF = "हाँ" perf: परीक्षण यदि 'cmd' जटिल है (और यह आमतौर पर है), तो यह दृष्टिकोण बनाए रखना बहुत आसान है। Cmd नियम में पर्यावरण चर को सेट करने के लिए आपका दृष्टिकोण इसे और अधिक कठिन बनाता है।
कीथ हनलन

1

मैं मूल लक्ष्य परीक्षण को फिर से लिखूंगा, देखभाल के लिए आवश्यक चर को समान रूप से परिभाषित किया गया है जो लॉन्च करने के लिए आवेदन के रूप में है:

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