我想更改这个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

to:

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运行。

我错过了什么?


当前回答

我只需要本地环境变量来调用我的test命令,这里有一个示例,在bash shell中设置多个环境变量,并在make中转义美元符号。

SHELL := /bin/bash

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

其他回答

Make变量没有导出到进程Make调用的环境中…默认情况下。但是,您可以使用make的导出来强制它们这样做。变化:

test: NODE_ENV = test

:

test: export NODE_ENV = test

(假设你有一个足够现代的GNU版本使>= 3.77)。

我只需要本地环境变量来调用我的test命令,这里有一个示例,在bash shell中设置多个环境变量,并在make中转义美元符号。

SHELL := /bin/bash

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

正如MadScientist指出的,你可以用以下方法导出单个变量:

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

我会重写最初的目标测试,注意所需的变量定义在与应用程序启动相同的子进程中:

test:
    ( NODE_ENV=test mocha --harmony --reporter spec test )