1.导入依赖包
下载:go get "github.com/spf13/viper"
2.编写yaml文件
放在conf目录下,文件名叫config.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
.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
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)
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
如果config.yaml跟config.go放在同目录简单的路径用上面这个,如果路径不同,且不同的同事用不同的编译软件,可以尝试下面的路径兼容
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)
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
3.使用config对象
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)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
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
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
把yaml文件的键值读取到viper对象的config当中