内容介绍
- 1.导入依赖包
- 2.编写yaml文件
- 3.编写读取yaml文件的go文件
- 4.使用config对象
- 5.viper源码分析
1.导入依赖包
import ( "github.com/spf13/viper" )
2.编写yaml文件
confconfig.yaml
# TODO 本地调试时放开 KubeSphere_URL: http://192.168.103.48:3188 # TODO 部署到环境时放开 #KubeSphere_URL: http://ks-apiserver.kubesphere-system.svc:80 KubesphereAdminUser: admin KubespherePassword: Admin123 #TODO 调用梅姐服务的ip,暂用当前,后续需要修改 Other_service_IP: http://192.168.103.48:30412 #Other_service_IP: http://container-cloud-system-controller-manager-metrics-service.container-cloud-system-system.svc:8093 Other_service_URL: /capis/quota.ictnj.io/v1alpha1/namespaces/ #TODO harbor镜像仓库地址 HARBOR_URL: https://192.168.66.4:443 HARBOR_ADMIN_USERNAME: admin HARBOR_ADMIN_PASSWD: Harbor12345 HARBOR_IP_HTTPS: 192.168.66.4:443 HARBOR_SSH_ADDRESS: 192.168.103.48:53304 HARBOR_SSH_USERNAME: root HARBOR_SSH_PASSWD: peng123.
3.编写读取yaml文件的go文件
放在config内容介绍下,文件名叫config.go
configurationPath
vscode跟golang对相对路径处理不同
package config import ( "github.com/spf13/viper" ) const ( configurationName = "config" configurationPath = "./conf" // vscode特殊读取路径 // configurationPath_vscode = "../conf" ) var Config *viper.Viper func init() { Config = viper.New() Config.SetConfigName(configurationName) Config.AddConfigPath(configurationPath) Config.SetConfigType("yaml") Config.AddConfigPath(configurationPath) if err := config.ReadInConfig(); err != nil { panic(err) } }
config.yaml
package config import ( "github.com/spf13/viper" ) const ( configurationName = "config" configurationPath = "./conf" // vscode特殊读取路径 configurationPath_vscode = "../conf" ) var Config *viper.Viper func init() { Config = viper.New() Config.SetConfigName(configurationName) Config.AddConfigPath(configurationPath) Config.SetConfigType("yaml") if err := Config.ReadInConfig(); err != nil { Config.AddConfigPath(configurationPath_vscode) if err := Config.ReadInConfig(); err != nil { Config.AddConfigPath(configurationPath) panic(err) } } }
4.使用config对象
Config.GetString("KubeSphere_URL")
5.viper源码分析
type Viper struct { // Delimiter that separates a list of keys // used to access a nested value in one go keyDelim string // A set of paths to look for the config file in configPaths []string // The filesystem to read config from. fs afero.Fs // A set of remote providers to search for the configuration remoteProviders []*defaultRemoteProvider // Name of file to look for inside the path configName string configFile string configType string configPermissions os.FileMode envPrefix string automaticEnvApplied bool envKeyReplacer StringReplacer allowEmptyEnv bool config map[string]interface{} override map[string]interface{} defaults map[string]interface{} kvstore map[string]interface{} pflags map[string]FlagValue env map[string]string aliases map[string]string typeByDefValue bool // Store read properties on the object so that we can write back in order with comments. // This will only be used if the configuration read is a properties file. properties *properties.Properties onConfigChange func(fsnotify.Event) }
func (v *Viper) ReadInConfig() error { jww.INFO.Println("Attempting to read in config file") filename, err := v.getConfigFile() if err != nil { return err } if !stringInSlice(v.getConfigType(), SupportedExts) { return UnsupportedConfigError(v.getConfigType()) } jww.DEBUG.Println("Reading file: ", filename) file, err := afero.ReadFile(v.fs, filename) if err != nil { return err } config := make(map[string]interface{}) err = v.unmarshalReader(bytes.NewReader(file), config) if err != nil { return err } v.config = config return nil }
把yaml文件的键值读取到viper对象的config当中