2014-05-24 3 views
52

Я хотел бы изменить этот Makefile:Как установить переменную среды в 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.

Что я пропустил?

ответ

83

Сделать переменные п ot экспортируется в среду процессов, вызывает вызовы ... по умолчанию. Однако вы можете использовать make export, чтобы заставить их это сделать. Изменение:

test: NODE_ENV = test 

к этому:

test: export NODE_ENV = test 

(если у вас есть достаточно современная версия GNU сделать).

+2

У меня ГНУ сделать 3,81, и 'всего: <\n\t> экспорт PROJ_ROOT = $ (CurDir) <\n\t> эхо $ (PROJ_ROOT) <\n>' выводит правильное расширение для первой строки, но только 'echo' для второго , 'PROJ_ROOT' не устанавливается после запуска make. Пробелы вокруг '=' дают «неправильное имя переменной» для экспорта. Наличие первой строки в качестве предпосылки, как в вашем примере, дает «команды начинаются до первой цели» – Gauthier

+7

@ Gauthier да, конечно. Это не то, что я написал. Вы добавили <\n\t> после 'all:', чего нет в моем примере. Мой пример предназначен для использования как написанный: он определяет целевую переменную, _NOT_, добавляя команду к рецепту. Также вы не можете одновременно использовать рецепт и целевую переменную для цели: вам нужно дважды записать цель. См. Второй пример в вопросе и задайте новый вопрос, если это не поможет его объяснить: в комментариях недостаточно места или форматирования. – MadScientist

5

Мне нужны только переменные окружения локально для вызова моей тестовой команды, вот пример, устанавливающий несколько кластеров окружения в оболочке bash и выходящий из знака доллара в make.

SHELL := /bin/bash 

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

Пожалуйста, отредактируйте свой ответ, чтобы включить какое-то объяснение. Кодовые ответы очень мало для обучения будущих читателей SO. Ваш ответ находится в очереди модерации за то, что он некачественный. – mickmackusa

+0

ThorSummoner, это решение не так гибко, как подход выше. Например, может потребоваться одно правило для вызова команды, а затем несколько других правил, которые изменяют это поведение, задавая переменные окружения. Рассмотрим: тест: CMD перфорация: экспорт PERF = "да" перфорация: тест Если 'Cmd' осложнена (и это обычно), то этот подход намного проще в обслуживании. Ваш подход к настройке переменной среды в правиле cmd делает это более сложным. –

Смежные вопросы