Chciałbym zmienić ten plik Makefile:
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
do:
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
Niestety drugi nie działa (proces węzła nadal działa z domyślnym NODE_ENV
.
Co mnie ominęło?
shell
makefile
environment-variables
target
bodokaiser
źródło
źródło
Unfortunately
komentarz wynika z nieporozumienia między zmienną środowiskową aMakefile
zmienną. Najlepszym sposobem udowodnienia, że zmienna środowiskowa została ustawiona, jestmake
wysłanie zapytania do tej zmiennej w innym programie, który zostanie wywołany. Jedynym działaniemecho $(BLAH)
jest po prostu ocena mechanizmu klucza / wartości Makefile wewnątrz Makefile. W Pythonie możeszprint(os.getenv("MURDOC"))
naprawdę zapytać o zmienną środowiskową.Odpowiedzi:
Zmienne make nie są domyślnie eksportowane do środowiska procesów make invokes ... Możesz jednak użyć marek,
export
aby je do tego zmusić. Zmiana:test: NODE_ENV = test
do tego:
test: export NODE_ENV = test
(zakładając, że masz wystarczająco nowoczesną wersję GNU make> = 3.77).
źródło
all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>
wyprowadza poprawne rozszerzenie dla pierwszego wiersza, ale tylkoecho
dla drugiego.PROJ_ROOT
nie jest ustawiana po uruchomieniu make. Spacje wokół=
dają „złą nazwę zmiennej” do eksportu. Pierwszy wiersz jako warunek wstępny, jak w przykładzie, daje „polecenia rozpoczynające się przed pierwszym celem”all:
, którego nie ma w moim przykładzie. Mój przykład ma być używany tak, jak napisano: definiuje zmienną specyficzną dla celu, NIE dodaje polecenia do receptury. Nie możesz również użyć receptury i zmiennej specyficznej dla celu w tym samym czasie: musisz napisać cel dwukrotnie. Zobacz drugi przykład w pytaniu i zadaj nowe pytanie, jeśli to nie pomaga w wyjaśnieniu: nie ma wystarczającej ilości miejsca lub formatowania w komentarzach.Jak wskazał MadScientist , możesz wyeksportować poszczególne zmienne za pomocą:
export MY_VAR = foo # Available for all targets
Lub zmienne eksportowych dla określonej docelowej ( target-specyficzne zmienne ):
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
Możesz także określić
.EXPORT_ALL_VARIABLES
cel - zgadłeś! - EKSPORTUJ WSZYSTKIE RZECZY !!!:.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
zobacz .EXPORT_ALL_VARIABLES
źródło
MY_VAR
s: jeden to zmienna makefile, do której dostęp jest dostępna jako,${MY_VAR}
a druga to zmienna eksportowana bash, dostępna jako$$MY_VAR
Potrzebowałem zmiennych środowiskowych tylko lokalnie, aby wywołać moje polecenie testowe, oto przykład ustawiania wielu zmiennych środowiskowych w powłoce bash i unikania znaku dolara
make
.SHELL := /bin/bash .PHONY: test tests test tests: PATH=./node_modules/.bin/:$$PATH \ JSCOVERAGE=1 \ nodeunit tests/
źródło
Chciałbym ponownie napisać oryginalny test docelowy, uważając, aby potrzebna zmienna została zdefiniowana W TYM SAMYM PODPROCESIE co aplikacja do uruchomienia:
test: ( NODE_ENV=test mocha --harmony --reporter spec test )
źródło