Я хочу инициализировать (создать и заполнить значениями по умолчанию) файл конфигурации с помощью viper, если он не существует.
Моя попытка заключается в следующем:
func setConfig() {
usr, _ := user.Current()
homedir := usr.HomeDir
v := viper.New()
v.SetDefault("instance", "acmedev01")
v.SetDefault("account", "serviceaccount")
v.SetDefault("password", "svcacctpassword")
v.SetConfigName("." + filepath.Base(os.Args[0]) + ".cfg")
v.AddConfigPath(homedir)
v.SetConfigType("toml")
err := v.ReadInConfig()
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found, initialize config file
v.SafeWriteConfig()
//log.Fatal("Please populate config file with appropriate values")
} else {
// Config file was found but another error was produced
checkerr(err)
}
fmt.Println(v.ConfigFileUsed())
Кажется, что вышеизложенное не записывает ни одного файла и не дает мне возврата ConfigFileUsed
. Должно быть, я упускаю что-то очевидное.
Есть две пинты, на которые следует обратить внимание:
Линия
ошибка: = v.ReadInConfig()
не возвращает никаких ошибок, если файл не существует, он просто создает новый. Таким образом, выполнение переходит не в блок if, а в else.
И тогда это зависит от того, как реализована функция checkerr()
(похоже, эта функция не существует в стандартной библиотеке golang). Если это выглядит так
func checkerr(e error) { ОС.Выход(0) }
ты никогда не дойдешь до линии
fmt.Println(v.ConfigFileUsed())
на самом деле файл создается в папке пользователя и является скрытым файлом (начинается с .), чтобы увидеть его, просто используйте ls -a
в домашнем каталоге пользователя.
Вам также следует проверить статус ошибки pkg.go.dev/github.com/spf13/viper#SafeWriteConfig