Я хотел бы изменить этот 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
чтобы:
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
.
Что я пропустил?
shell
makefile
environment-variables
target
bodokaiser
источник
источник
Unfortunately
комментарий связан с недоразумением между переменной среды иMakefile
переменной. Лучший способ доказать, что переменная среды установлена, - это запросить эту переменную среды внутри другой программы, которая будетmake
вызывать. Только действиеecho $(BLAH)
- это просто оценка механизма ключа / значения Makefile внутри Makefile. В python вы можетеprint(os.getenv("MURDOC"))
действительно запросить переменную среды.Ответы:
По умолчанию переменные make не экспортируются в среду процессов make invokes ... Однако вы можете использовать make,
export
чтобы заставить их сделать это. Изменить:к этому:
(при условии, что у вас достаточно современная версия GNU make> = 3.77).
источник
all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>
выводит правильное расширение для первой строки, но толькоecho
для второй.PROJ_ROOT
не устанавливается после запуска make. Пробелы вокруг=
дают "неправильное имя переменной" для экспорта. Наличие первой строки в качестве предварительного условия, как в вашем примере, дает «команды начинаются до первой цели»all:
, чего нет в моем примере. Мой пример предназначен для использования в том виде, в каком он написан: он определяет переменную, специфичную для цели, а НЕ добавляет команду в рецепт. Также вы не можете использовать рецепт и переменную, зависящую от цели, на цели одновременно: вы должны написать цель дважды. См. Второй пример в вопросе и задайте новый вопрос, если это не помогает объяснить: в комментариях недостаточно места или форматирования.Как указал MadScientist , вы можете экспортировать отдельные переменные с помощью:
Или экспортировать переменные для конкретной цели ( целевой конкретные переменные ):
Вы также можете указать
.EXPORT_ALL_VARIABLES
цель - как вы уже догадались! - ЭКСПОРТИРОВАТЬ ВСЕ ВСЕ !!!:см. .EXPORT_ALL_VARIABLES
источник
MY_VAR
s: один - это переменная makefile, доступ к которой осуществляется как,${MY_VAR}
а другой - переменная, экспортируемая из bash, доступная как$$MY_VAR
Мне нужны были только переменные среды локально, чтобы вызвать мою тестовую команду, вот пример, устанавливающий несколько переменных среды в оболочке bash и избегающий входа в систему
make
.источник
Я бы переписал исходный целевой тест, позаботившись о том, чтобы нужная переменная была определена В ЖЕ ПОДПРОЦЕССЕ как запускаемое приложение:
источник