Инициализация новой конфигурации 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 программно, но это кажется настолько очевидным вариантом использования, что я должен что-то здесь упустить.

0 ответов

Другие вопросы по тегам