Makefile 包含 env 文件

Makefile 包含 env 文件

我正在尝试将一些环境变量包含到 Makefile 中。 env 文件如下所示:

FOO=bar
BAZ=quux

export请注意,每个环境变量都没有引导。如果我在 Makefile 中添加前导文件exportincludeenv 文件,一切都会正常工作。但我需要保持环境变量没有领先export。这阻止了我只include envfile在 Makefile 中使用。

我也尝试过做这样的事情:

sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env

但是这样做会导致 make 抛出错误,因为 env 文件不存在可供包含。

答案1

我遇到了类似的问题并登陆了这个线程。另一种可能的解决方案是只执行不带任何参数的 make export 命令:

include .env
export

这会将所有 make 变量导出为环境变量。此行为可能会或可能不会匹配所有用例,但它对我有用并且不涉及任何 shell 脚本魔法。

答案2

如果您使用 gnu make,则应该包含该envfile文件,然后导出从同一文件获得的变量列表:

#!make
include envfile
export $(shell sed 's/=.*//' envfile)

test:
        env

答案3

要完成之前的回答meuh,如果您希望 env 文件是动态的,您可以定义一个设置函数。

  • 创建包含一些内容的env/local-dev.env文件env/integ.env
  • 定义一个方法来加载它
    定义setup_env
        $(eval ENV_FILE := env/$(1).env)
        @echo“-设置环境$(ENV_FILE)”
        $(eval包括env/$(1).env)
        $(eval export sed 's/=.*//' env/$(1).env)
    恩德夫

然后使用它

    localDevEnv: ##加载env/local-dev.env环境
        $(调用 setup_env,local-dev)
    integEnv: ##加载env/integ.env环境
        $(调用setup_env,整数)

答案4

保留预先存在的 ENV 变量

export $(shell [ ! -n "$(ENVFILE)" ] || cat $(ENVFILE) | grep -v \
    --perl-regexp '^('$$(env | sed 's/=.*//'g | tr '\n' '|')')\=')

test:
    echo $$FOO

跑步

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

相关内容