Makefile में env फ़ाइल शामिल है


26

मैं कुछ env vars को Makefile में शामिल करने की कोशिश कर रहा हूँ। एनवी फ़ाइल की तरह दिखता है:

FOO=bar
BAZ=quux

ध्यान दें कि exportप्रत्येक env var के लिए कोई अग्रणी नहीं है । अगर मैं Makefile में अग्रणी exportऔर सिर्फ includeenv फ़ाइल जोड़ता हूं , तो सब कुछ वैसा ही काम करता है जैसा कि इसे करना चाहिए। लेकिन मुझे env vars को अग्रणी बनाए रखने की आवश्यकता है export। यह मुझे सिर्फ include envfileमेकफाइल में उपयोग करने से रोकता है ।

मैंने भी कुछ ऐसा करने की कोशिश की है:

sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env

लेकिन ऐसा करने से त्रुटि उत्पन्न होती है क्योंकि env फ़ाइल इसमें शामिल नहीं है।


1
यूनिक्स और लिनक्स में आपका स्वागत है। कृपया स्पष्ट रूप से पूछे गए प्रश्न को स्पष्ट करें। यह वास्तव में क्या है जिसे आप पूरा करने की कोशिश कर रहे हैं?
डेनिर

1
मैं एक फाइल को शामिल करने की कोशिश कर रहा हूं जिसमें पर्यावरण चर जोड़े मेकफाइल में हैं ताकि वे उस वातावरण के लिए उपलब्ध हों जिसमें मेक चल रहा है।
माइकल इरविन

जवाबों:


40

यदि आप ग्नू मेक का उपयोग कर रहे हैं envfile, तो फ़ाइल को शामिल करने के लिए क्या काम करना चाहिए , तो उसी फ़ाइल से प्राप्त होने वाले वेरिएंट की सूची निर्यात करें:

#!make
include envfile
export $(shell sed 's/=.*//' envfile)

test:
        env

7
इस उत्तर के लिए धन्यवाद, यह शानदार है! हालांकि मेरा संस्करण बिना export $(shell...लाइन के भी काम करता है । मुझे बस includeलाइन चाहिए।
डफज

32

मुझे एक समान समस्या थी और इस धागे पर उतरा। एक और संभव उपाय यह है कि आप बिना किसी तर्क के केवल निर्यात कमांड करें:

include .env
export

यह सभी निर्यात चर को पर्यावरण चर के रूप में निर्यात करेगा। यह व्यवहार सभी उपयोग के मामलों से मेल खा सकता है या नहीं भी हो सकता है, लेकिन इसने मेरे लिए काम किया और किसी भी शेल स्क्रिप्टिंग विज़ार्ड को शामिल नहीं किया।


3

पहले से मौजूद ईएनवी वर्जन को सुरक्षित रखता है

export $(shell [ ! -n "$(ENVFILE)" ] || cat $(ENVFILE) | grep -v \
    --perl-regexp '^('$$(env | sed 's/=.*//'g | tr '\n' '|')')\=')

test:
    echo $$FOO

चलाने के लिए

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

3

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

export BASH_ENV=tools/sh/env.sh

कुछ गोत्र हैं। दुर्भाग्य से ENV काम नहीं करता है, मुझे लगता है कि इसे (लेकिन यह बैश के साथ एक मुद्दा है, मेक नहीं)। इसके अलावा यह वास्तव में एक और लाइन की आवश्यकता है, क्योंकि मेक का डिफ़ॉल्ट शेल दुभाषिया / बिन / श है।

BASH_ENV := tools/sh/env.sh
SHELL := /usr/bin/bash

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

कल्पित शैल लिपियों की भरमार है। मुझे सरल उत्तर के लिए यह क्यू / ए सबसे अच्छा लगता है।


2

यदि आपका फ़ाइल नाम है, .makercतो आप इसे मेकफाइल के रूप में सरल रूप में शामिल कर सकते हैं:

include .makerc

मैं किसी भी चेतावनी को दबाने के लिए -पहले हस्ताक्षर जोड़ना पसंद करता हूं include

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