如何在 Makefile 中从 .env 动态加载值?

How can I dynamically load values from .env in Makefile?

我有一个如下所示的 Makefile 目标:

env-%:
    @echo "Getting ${*} env"
    cat .env-common > .env
    @echo >> .env
    cat .env-${*} >> .env
    @echo >> .env
    cat .env

    echo "Loading .env contents into shell"
    source .env

    echo ${SOMETHING_FROM_COMMON}
    echo ${SOMETHING_FROM_DEV}

然后期望 SOMETHING_FROM_DEV 在环境中的其他目标,例如:

something-else-%: .env-%
    echo ${SOMETHING_FROM_DEV} # Actual step is a docker build, but thats irrelevant here I think.

我的想法是,我可以像 $ make something-else-dev 那样调用它,它将 运行 env-dev 的先决任务,它连接两个环境文件以创建一个 .env文件。然后它需要将 .env 中的所有内容加载到 shell 中,完成先决条件步骤。最后,something-else 运行s 和 echo(或该配方包含的任何内容)具有使用值。

.env-common 文件如下所示:

# Common variables
SOMETHING_FROM_COMMON=hello

.env-dev 文件如下所示:

# Dev specific variables
SOMETHING_FROM_DEV=hello-from-dev

按上述方式尝试 include 会产生以下结果:

echo "Loading .env contents into shell"
Loading .env contents into shell
include .env
make: include: No such file or directory
make: *** [env-dev] Error 1

使用 eval 过早引入文件,我认为是在首次使用时而不是在目标中 运行 时。 source 似乎没有像我预期的那样工作,但我怀疑我也没有理解正确。

也许有一种方法可以调用 bash 将它们加载到环境中?

This gist 很接近,但理想情况下我想使用目标之间示例中的 $$SECRET_KEY

理想情况下,.env 文件中也会支持评论(前缀为 #,但这不会破坏交易。

欢迎任何想法/想法。

看来您应该改用其他设施。

include .env-common
include .env-${ENV}

现在,make ENV=dev 将包括 .env-common.env-dev

也许使第二个条件成为条件,并且仅在实际设置了 ENV 时才这样做,或者为 ENV 指定默认值。