Инициализация новой конфигурации Go с Viper
Я изучал управление конфигурацией в Go с помощью пакета viper, о котором я узнал в другом вопросе. У меня проблемы с пониманием, как инициализировать новую конфигурацию. Я хочу найти системные конфигурации, если они существуют, затем пользовательскую конфигурацию, а затем, если ничего не помогает, создать (а затем использовать) новую пользовательскую конфигурацию по умолчанию. При следующем запуске приложения я ожидаю найти ранее созданную конфигурацию. Я использую это так:
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: нет такого файла или каталога", даже если он существует. Если я отредактирую файл вручную, Viper найдет его и проанализирует. Очевидно, что я могу создать файл JSON программно, но это кажется настолько очевидным вариантом использования, что я должен что-то здесь упустить.