1

我们有一个我们正在启动的二进制文件,它有几个子命令,全部设置为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,我无法找到替代方案。

4

0 回答 0