0

我一直在使用viper 包探索 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
    }
}

结果是该文件为空,并且第二次尝试读取该文件也失败并显示消息“打开:没有这样的文件或目录”,即使它存在。如果我手动编辑文件,Viper 会找到并解析它。显然我可以以编程方式创建 JSON 文件,但这似乎是一个如此明显的用例,我必须在这里遗漏一些东西。

4

0 回答 0