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