如何从 makefile 中的另一个文件加载环境变量?

Rem*_*tec 0 unix bash makefile environment-variables sh

我想在运行 makefile 命令时设置环境变量,但理想情况下这些变量将存储在另一个文件中。

./生成文件

_init_dev:
    . ./config/dev-env

diff-dev: _init_dev
    cdk diff

deploy-dev: _init_dev
    cdk deploy
Run Code Online (Sandbox Code Playgroud)

./config/dev-env

export HELLO_CDK_DEPLOY_ENVIRONMENT=dev
Run Code Online (Sandbox Code Playgroud)

首先,我尝试使用source加载变量,但是失败并显示以下消息:

make: source: Command not found

我明白这是因为make运行sh而不是bash

然后我尝试.在配置文件前面添加以尝试以这种方式加载变量。

这两种方法都没有奏效。当我运行cdk命令时,我可以从输出中看到环境变量尚未设置。

任何人都可以建议一种让它发挥作用的方法吗?

Mad*_*ist 7

makefile 中的每个配方行都在其自己的 shell 中运行。环境变量会修改当前 shell,但这些更改会在 shell 退出时消失。因此,一个配方设置的环境变量在不同配方中可见是完全不可能的。

如果您希望这些变量可用,则必须在每个配方行中获取它们,如下所示:

diff-dev:
        . ./config/dev-env && cdk diff

deploy-dev:
        . ./config/dev-env && cdk deploy
Run Code Online (Sandbox Code Playgroud)

您可以将其放入变量中,例如:

CDK = . ./config/dev-env && cdk

diff-dev:
        $(CDK) diff

deploy-dev:
        $(CDK) deploy
Run Code Online (Sandbox Code Playgroud)

或者,如果您的dev-env文件是一种足够简单的格式(例如您显示的格式),它既可以作为 makefile 又可以作为 shell 脚本,那么您可以包含它:

include ./config/dev-env

diff-dev:
        cdk diff

deploy-dev:
        cdk deploy
Run Code Online (Sandbox Code Playgroud)

但这仅适用于非常有限的内容dev-env(基本上是简单地将变量分配给静态字符串)。