如何设置子进程的环境变量的Makefile

问题描述 投票:93回答:3

我想改变这个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
3个回答
131
投票

使变量没有导出到进程的环境使所调用...默认。然而,你可以用make的export迫使他们这样做。更改:

test: NODE_ENV = test

为此:

test: export NODE_ENV = test

(假设你有GNU化妆的足够现代版)。


46
投票

作为MadScientist pointed out,您可以导出单个变量有:

export MY_VAR = foo  # Available for all targets

或特定目标出口变量(target-specific variables):

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所有的东西!!!!

.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


13
投票

我只需要在环境变量本地调用我的测试命令,这里有一个例子在bash shell设置多个环境瓦尔,并在逃跑的make美元符号。

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/
© www.soinside.com 2019 - 2024. All rights reserved.