Shell 如何设置子进程';Makefile中的环境变量
我想更改此生成文件:Shell 如何设置子进程';Makefile中的环境变量,shell,makefile,environment-variables,target,Shell,Makefile,Environment Variables,Target,我想更改此生成文件: SHELL := /bin/bash PATH := node_modules/.bin:$(PATH) boot: @supervisor \ --harmony \ --watch etc,lib \ --extensions js,json \ --no-restart-on error \ lib test: NODE_
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
致:
不幸的是,第二个节点不起作用(节点进程仍然使用默认的node\u ENV
运行)
我遗漏了什么?默认情况下,Make变量不会导出到进程Make invokes的环境中。但是,您可以使用Make的
导出
强制它们这样做。更改:
test: NODE_ENV = test
为此:
test: export NODE_ENV = test
(假设您有一个足够现代的GNU make>=3.77版本)。我只需要本地的环境变量来调用我的测试命令,下面是一个在bash shell中设置多个环境变量并转义美元登录
make
的示例
SHELL := /bin/bash
.PHONY: test tests
test tests:
PATH=./node_modules/.bin/:$$PATH \
JSCOVERAGE=1 \
nodeunit tests/
如所示,您可以通过以下方式导出单个变量:
export MY_VAR = foo # Available for all targets
或导出特定目标()的变量:
您还可以指定
。将所有变量导出到您猜到的目标!-导出所有内容!!!:
.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
请参见我将重新编写原始目标测试,注意所需的变量在与要启动的应用程序相同的子流程中定义:
test:
( NODE_ENV=test mocha --harmony --reporter spec test )
我有GNU make 3.81和all:export PROJ_ROOT=$(CURDIR)echo$(PROJ_ROOT)
为第一行输出正确的扩展名,但为第二行只输出echo
。PROJ_ROOT
在运行make后未设置。=
周围的空格给出“错误的变量名”用于导出。如示例中所示,将第一行作为先决条件将给出“在第一个目标之前开始命令”@Gauthier是的,当然。这不是我写的。你在all:
之后添加了一个,这不在我的示例中。我的示例旨在作为书面形式使用:它定义一个特定于目标的变量,而不是向配方中添加命令。此外,你不能同时在目标上使用配方和特定于目标的变量:你必须写两次目标。请参阅问题中的第二个示例,如果这无助于解释问题,请提出一个新问题:注释中没有足够的空间或格式。多个变量如何?这很好,但您已将其添加到目标的头部。仅在目标的上下文中列出它们是不起作用的?因为它不适用于MetaTarget speci在GNU make 3.77中添加了fic变量。它们在GNU make 3.81中可导出。请参见编辑您的答案以包含一些解释。仅代码的答案对未来SO读者的教育作用不大。您的答案因质量低下而处于审核队列中。ThorCaller,此解决方案不如上述方法灵活。例如,您可能希望有一个用于调用命令的规则,然后有几个其他规则通过设置环境变量来修改该行为。请考虑:test:cmd perf:export perf=“yes”perf:test如果“cmd”很复杂(通常是这样),则此方法更易于维护。您在cmd规则中设置环境变量的方法使此操作更为困难。奇怪的是,我之前对其进行了测试,结果表明它有效….(不确定为什么现在….)我可以返回并删除我猜的注释。@AnthonyC它之所以有效,是因为有两个myu-VAR
s:一个是作为${myu-VAR}访问的makefile变量
另一个是bash exported variable,作为$$MY_VAR
访问非常有用。但是找不到只导出一组变量的方法。请注意,如果makefile中已经存在该变量,并且您只想将其导出到另一个命令,则可以使用语法export VAR?=
而不指定新值自然地,注释源于环境变量与Makefile
变量之间的误解。证明已设置环境变量的最佳方法是在另一个make
wil调用的程序中查询此环境变量。仅执行echo$(废话)
只是在Makefile中评估Makefile的键/值机制。在python中,您可以打印(os.getenv(“MURDOC”)
来真正查询环境变量。
.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
test:
( NODE_ENV=test mocha --harmony --reporter spec test )