如何在 Makefile 中为不同命令导出带有环境变量的多个配置文件?

问题描述 投票:0回答:1

我想创建一个 Makefile,它允许我在不同的环境中运行脚本,这取决于秘密 ENV_VAR 和公开的 ENV 环境变量:

export ENV_VAR=<secret_env_var>

setup: 
    python my_script.py

dev_setup: export ENV:=dev
dev_setup: setup

test_setup: export ENV:=test
test_setup: setup

我可以在单独的文件中包含秘密,添加包含用于开发环境的 ENV_VAR 的

include config_dev.env
文件。但对于测试环境,我应该使用另一个秘密 ENV_VAR 将行更改为
include config_test.env

我看不到将指令

include
定义到命令步骤中的可能性,以及如何使用
export ENV
环境变量来完成它。

或者应该如何以正确的方式完成?

我尝试了这个,注释/取消注释第一行代码

include config_dev.env
#include config_test.env

export ENV_VAR=<secret_env_var>

setup: 
    python my_script.py

dev_setup: export ENV:=dev
dev_setup: setup

test_setup: export ENV:=test
test_setup: setup
bash makefile environment-variables config environment
1个回答
0
投票

我不太明白保密如何附加到价值

ENV_VAR
虽然它是从
include
编辑的文件中设置的,但是制作时间选择 将
ENV
ENV_VAR
设置为它们的
dev
值或它们的
test
值 可以根据 make 目标是否为
dev_setup
test_setup
。显然它们是相互排斥的目标,我想
dev_setup
可以是默认值。

$ cat Makefile 
target := $(MAKECMDGOALS)
ifeq (,$(target))
target := dev_setup
endif

ifeq (dev_setup,$(target))
include config_dev.env
export ENV := dev
else
ifeq (test_setup,$(target))
include config_test.env
export ENV := test
else
$(error Choose one target: dev_setup (default) or test_setup)
endif
endif

export ENV_VAR:=$(secret_env_var)

.PHONY: setup dev_setup test_setup

$(target): setup
    @echo $(target) done

setup:
    @python3 -c "import os;print('ENV =', os.getenv('ENV'));print('ENV_VAR =', os.getenv('ENV_VAR'))"
    @echo Setup done.
    

$ cat config_dev.env 
secret_env_var=dev_setup_secret


$ cat config_test.env 
secret_env_var=test_setup_secret


$ make
ENV = dev
ENV_VAR = dev_setup_secret
Setup done.
dev_setup done


$ make dev_setup
ENV = dev
ENV_VAR = dev_setup_secret
Setup done.
dev_setup done


$ make test_setup
ENV = test
ENV_VAR = test_setup_secret
Setup done.
test_setup done


$ make test_setup dev_setup
Makefile:14: *** Choose one target: dev_setup (default) or test_setup. Stop.
© www.soinside.com 2019 - 2024. All rights reserved.