我想用环境变量设置一些用于开发,登台和生产的文件,例如:
application_root/development.env
KEY1=value1
KEY2=value2
会有类似的文件staging.env
和production.env
。
我正在寻找几个不同的bash脚本,这些脚本允许在开发或暂存/生产中加载所有这些变量。
在本地开发中,我希望为文件中的每一行有效地运行export KEY1=value1
。
对于登台/制作,我将部署到Heroku,并希望为heroku config:set -a herokuappname KEY1=value1
或staging
文件中的每一行有效运行production.env
。
我知道有一些宝石是为这样设计的,但看起来这可能很简单。我还喜欢将.env
文件作为简单的键和值列表的灵活性,而不是特别绑定到任何语言/框架。如果我不得不改变一些关于这些变量需要加载的方式,那就是更改脚本而不是.env
文件。
答案 0 :(得分:0)
在最简单的形式中,您可以将键值对加载到bash
数组中,如下所示:
IFS=$'\n' read -d '' -ra nameValuePairs < ./development.env
在Bash v4 +中,它更简单:
readarray -t nameValuePairs < ./development.env
然后,您可以将生成的"${nameValuePairs[@]}"
数组传递给export
或heroku config:set ...
等命令; e.g:
export "${nameValuePairs[@]}"
但请注意,如果输入*.env
文件符合以下条件的所有,则上述内容仅按预期工作:
<key>=<value>
,=
周围没有空格对于不符合此严格格式的文件,需要采用不同的方法;例如,this related question处理可能包含引用的值的文件。
以下是名为bash
的{{1}}脚本的源代码(load_env
后缀通常不是必需且含糊不清的):
您可以使用感兴趣的.sh
文件调用它,它会根据*.env或heroku config:set …
) >文件名
但是,如上所述,您必须源脚本(使用export
或其有效source
别名bash
)才能创建当前 shell可见的环境变量(.
)
为了防止模糊的失败,如果您传递export
文件并在没有采购的情况下调用脚本,脚本会抱怨。
示例:
development.env
./load_env ./staging.dev
. ./load_env ./development.dev # !! Note the need to source
源代码load_env