使用Viper初始化新的Go配置

时间:2016-01-02 17:28:41

标签: go viper-go

我一直在使用我在viper package中了解到的another question在Go中探索配置管理。我无法理解如何初始化新配置。我想要做的是找到系统配置(如果存在),然后是用户配置,然后,如果所有其他方法都失败,则从默认值创建(然后使用)新用户配置。下次运行应用程序时,我希望找到我之前创建的配置。我这样使用它:

import (
    "fmt"
    "github.com/spf13/viper"
    "os"
    "os/user"
    "path/filepath"
)

usr, err := user.Current()
appMode := "test" // or "production" or...
configDir := filepath.Join(usr.HomeDir, ".myapp")
config := viper.New()

config.SetConfigName(appMode)
config.SetConfigType("json")

config.SetDefault("group1.key1", "value1.1")
config.SetDefault("group1.key2", 1234)
config.SetDefault("group2.key1", "value2.1")
config.SetDefault("group2.key2", 5678)

config.AddConfigPath("/usr/share/myapp/config")
config.AddConfigPath("/usr/local/share/myapp/config")
config.AddConfigPath(configDir)

if err := config.ReadInConfig(); err != nil {
    filename := filepath(configDir, fmt.Sprintf("%s.json", appMode))
    _, err := os.Create(filename)
    if err != nil {
        panic(fmt.Stringf("Failed to create %s", filename))
    }
}

if err := config.ReadInConfig(); err != nil {
    panic("Created %s, but Viper failed to read it: %s",
          filename, err)
}

此时,我希望为我创建〜/ .myapp / test.json,其中包含以下内容:

{
    "group1": {
        "key1": "value1.1",
        "key2": 1234
    },
    "group2": {
        "key1": "value2.1",
        "key2": 5678
    }
}

结果是该文件为空,并且第二次尝试读取该文件也失败,并显示消息" open:no such file or directory"即使它存在。如果我手动编辑文件,Viper会找到并解析它。显然,我可以以编程方式创建JSON文件,但这似乎是一个明显的用例,我必须在这里遗漏一些东西。

0 个答案:

没有答案