U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 土豆PE使用教程 >

使用viper管理配置文件 并 实现使用环境变量覆盖配置文件

来源:http://www.tudoupe.com时间:2022-02-27

需求:
使用viper管理配置文件。项目部署后,通过修改环境变量,以达到使用环境变量中的配置 覆盖 config file中配置的目的。

一、使用viper来管理配置文件

// 代码结构

通过 EXPORT APP_TEST_ENV=000233设置环境变量,覆盖配置文件中的 TEST_ENV

实验验证成功!

二、对于非嵌套型配置

可直接通过 viper.Unmarshal(&ConfigSetting) 进行读取,方法执行时,如果 AutomaticEnv = true,且 viper.SetEnvPrefix(“app”) 设置成功。那么在加载配置文件的时候,会自动使用env中的配置将配置文件中的配置覆盖掉;其配置文件与env中项的对应关系为:

APP_TEST_ENV(环境变量中的配置,必须为全部大写) <=> Test_Env(此处为配置文件中的项,大小写不敏感)

总结:
在非嵌套型的配置中,可以通过设置 EnvPrefix 和 AutomaticEnv 来自动使用env覆盖config中的配置项

三、对于嵌套型配置

通过 viper.UnmarshalKey(“groups”, &GroupsSetting) 将配置文件中 groups 下的全部配置加载到 GroupsSetting 中。

若环境变量中存在了 APP_GROUPS = xxx ;此时会出现报错,因为上述方法执行的时候,会将环境变量中的配置读取出来,并替换掉配置文件中groups下的全部数据。(注意,通过env读取到的groups数据,全部为string类型的;而在配置文件中读取的数据为map型的)此时报错信息为:

对于该问题,可以通过自定义 DecoderConfigOption 钩子函数来解决问题。// TODO 还未完成

-------------------------------------补充Hook函数解决方案----------------------------------------

3-1、首先对UnmarshalKey源码进行分析

源码分析

通过 viper.DecodeHook()解决问题

【总结】

上述方案可以通过viper本身的设计,以精简的代码完成需求, 但在env整体覆盖config中的某个模块的全部配置文件,是否更方便?不过在Google里查到的解决方案,都是在env中使用 json string 整体覆盖 config file 中配置的。参考 https://github.com/spf13/viper/issues/641

另外该方式有个缺点,在使用 export 将某个模块的配置加到env之后,如果 加到env中的json string中不能包含全部的配置子项,那么该配置将会为空;

但该方式也有个优点,yaml的嵌套层次可以无限递归下去. 亲测有效;

四、针对于嵌套型配置的解决方案

使用反射技术来完成。如果使用如下方案,那么在初始化viper的时候,无需设置 envpreifx 和 automaticenv

五、Grafana项目中的配置文件读取方式调研

Grafana开源项目可以自行检索,非常棒的一个项目;

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息