gpt4 book ai didi

makefile - 如何从Makefile中的.env文件加载和导出变量?

转载 作者:行者123 更新时间:2023-12-04 04:29:05 35 4
gpt4 key购买 nike

在Makefile中使用.env的最佳方法是什么,即加载该文件并导出make中子外壳的所有变量?

如果提议的解决方案仅适用于make,例如不使用任何第三方工具。 .env文件还支持多行变量,例如:


FOO="this\nis\na\nmultiline\nvar"


这就是为什么this solution可能不够用的原因。

最佳答案

Make不提供任何方式将文件内容读取到某个变量。因此,我认为如果不使用外部工具就不可能获得结果。但是,如果我错了,我将很高兴学习一些新技巧。

因此,我们假设有两个文件.env是技术上正确的shell文件:

FOO=bar

BAR="notfoo" # comment
#comment
MULTILINE="This\nis\nSparta!"
# comment


script.sh

#!/bin/bash
echo FOO=${FOO}
echo BAR=${BAR}
echo -e ${MULTILINE}


一种解决方案是包括 .env文件,然后确保导出变量:

include .env

$(eval export $(shell sed -ne 's/ *#.*$//; /./ s/=.*$$// p' .env))

all:
./script.sh


由于shell和make对引号的处理不同,您将在输出中看到引号。

您可以通过make重新处理变量来避免这种情况:

include .env

VARS:=$(shell sed -ne 's/ *\#.*$$//; /./ s/=.*$$// p' .env )
$(foreach v,$(VARS),$(eval $(shell echo export $(v)="$($(v))")))

all:
./script.sh


但后来多行变量变成了单线。

最后,您可以生成一个临时文件,以供bash处理,并在运行任何命令之前将其来源:

SHELL=bash

all: .env-export
. .env-export && ./script.sh

.env-export: .env
sed -ne '/^export / {p;d}; /.*=/ s/^/export / p' .env > .env-export


哦,在这种情况下,新行在多行变量中被弄乱了。您需要另外引用它们。

最后,您可以使用上述 export命令将 sed添加到.env,然后执行以下操作:

SHELL=bash
%: .env-export
. .env-export && make -f secondary "$@"

关于makefile - 如何从Makefile中的.env文件加载和导出变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44628206/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com