使用go-viper的多个配置文件

vcudknz3  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(166)

是否可以使用Viper加载/合并多个配置文件?假设我有一个包含程序配置的通用配置文件,以及包含每个客户端配置的客户端特定配置文件,其中一个配置文件将被加载,这取决于程序的输入。
谢谢.

j2cgzkjk

j2cgzkjk1#

viperReadInConfigMergeInConfig,可以多次调用。下面是一个(未经测试的)例子:

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]
jc3wubiy

jc3wubiy2#

如果您使用的是viper.WatchConfig(),那么来自@svenwltr的答案将不起作用,因为它只会查看您告诉它的最后一个配置文件。
然而,如果你只是为每个配置文件创建自己的viper结构体,它可能会工作:

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"))
}

相关问题