欢迎您访问系统网
您现在的位置是:首页» windows系统» viper配置文件,viper软件会改环境变量吗

viper配置文件,viper软件会改环境变量吗

2024-07-13 03:31:35
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。需求:使用viper管理配置文件。项目部署后,通过修改环境变量,以达到使用环境变量中的配置 覆盖 config file中配

本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。

需求:使用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开源项目可以自行检索,非常棒的一个项目;

XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com