Как настроить кобру и гадюку для тестовых конфигураций в golang - PullRequest
0 голосов
/ 21 апреля 2020

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

...