是否可以使用Viper加载/合并多个配置文件?假设我有一个包含程序配置的通用配置文件,以及包含每个客户端配置的客户端特定配置文件,其中一个配置文件将被加载,这取决于程序的输入。谢谢.
j2cgzkjk1#
viper有ReadInConfig和MergeInConfig,可以多次调用。下面是一个(未经测试的)例子:
viper
ReadInConfig
MergeInConfig
viper.SetConfigName("default") viper.AddConfigPath(path) viper.ReadInConfig() if context != "" { viper.SetConfigName(context) viper.AddConfigPath(path) viper.MergeInConfig() } viper.SetConfigName("config") viper.AddConfigPath(".") viper.MergeInConfig()
它按以下顺序读取这些文件:
$path/default.[yaml|toml|json]
$path/$context.[yaml|toml|json]
./config.[yaml|toml|json]
jc3wubiy2#
如果您使用的是viper.WatchConfig(),那么来自@svenwltr的答案将不起作用,因为它只会查看您告诉它的最后一个配置文件。然而,如果你只是为每个配置文件创建自己的viper结构体,它可能会工作:
viper.WatchConfig()
var v1, v2, v3 *viper.Viper func init() { v1 = &viper.Viper{} v1.SetConfigName("default") v1.AddConfigPath(path) v1.ReadInConfig() v1.OnConfigChanged(viperConfigChanged) v1.WatchConfig() if context != "" { v2 = &viper.Viper{} v2.SetConfigName(context) v2.AddConfigPath(path) v2.MergeInConfig() v2.OnConfigChanged(viperConfigChanged) v2.WatchConfig() } v3 = &viper.Viper{} v3.SetConfigName("config") v3.AddConfigPath(".") v3.MergeInConfig() v3.OnConfigChanged(viperConfigChanged) v3.WatchConfig() } func viperConfigChanged(e fsnotify.Event) { fmt.Println(v1.GetString("foo")) if v2 != nil { fmt.Println(v2.GetString("bar")) } fmt.Println(v3.GetString("baz")) }
2条答案
按热度按时间j2cgzkjk1#
viper
有ReadInConfig
和MergeInConfig
,可以多次调用。下面是一个(未经测试的)例子:它按以下顺序读取这些文件:
$path/default.[yaml|toml|json]
$path/$context.[yaml|toml|json]
./config.[yaml|toml|json]
jc3wubiy2#
如果您使用的是
viper.WatchConfig()
,那么来自@svenwltr的答案将不起作用,因为它只会查看您告诉它的最后一个配置文件。然而,如果你只是为每个配置文件创建自己的viper结构体,它可能会工作: