我一直在使用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 文件,但这似乎是一个如此明显的用例,我必须在这里遗漏一些东西。