У нас есть двоичный файл, который мы запускаем и который имеет несколько подкоманд, настроенных на cobra
. И мы хотим использовать viper
для конфигурации. Таким образом, инициализация этого настроена в соответствии с документами:
func init() {
cobra.OnInitialize(initConfig)
RootCmd.PersistentFlags().StringVarP(&loglevel, "loglevel", "l", "info", "Default log level")
//other persistent flags
viper.BindPFlags(RootCmd.PersistentFlags())
log.CreateLogger(loglevel)
//add all other subcommands
RootCmd.AddCommand(...)
}
Моя проблема с initConfig
:
func initConfig() {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
} else {
// Find home directory.
home, err := homedir.Dir()
if err != nil {
handleError(err)
os.Exit(1)
}
confDir = filepath.Join(home, DefaultConfigDir)
viper.Set("configDir", configDir)
viper.SetConfigName("config")
viper.SetConfigType("json")
viper.AddConfigPath(configDir)
viper.AddConfigPath(".")
cfgFile = filepath.Join(configDir, "config.json")
}
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired l
err := os.Mkdir(cfgDir, os.ModePerm)
if err != nil {
handleError(err)
}
err = viper.WriteConfigAs(cfgFile)
if err != nil {
handleError(err)
}
} else {
handleError(err)
os.Exit(1)
}
}
}
Это выполняется внутри init
, и это в моем пакет подкоманд - поэтому мои тесты подкоманд также будут запускать этот init
.
Проблема в том, что он ищет папку home
и, конечно, может испортить существующие конфигурации. Другими словами, я не хочу этого для тестирования, я хочу чистый каталог тестирования.
Как мне этого добиться? Поскольку он должен работать внутри init
из-за флагов и ранней инициализации конфигов, я не смог найти альтернативу.