Если мы хотим внедрить лучшие практики для управления нашими файлами conf. Итак, получение переменных из файла conf, а также из окружения. Но многие разработчики не хотят управлять 2 хранилищами информации. Они используются для работы только с одним файлом конфигурации. Итак, чтобы помочь тем, кто не хочет управлять двумя репозиториями…
Мы можем создать такой проект, как:
main.go config |- config.development.json |- config.production.json
На нашем main.go (или в config.go, предназначенном для управления всей конфигурацией)
У нас должна быть структура, представляющая нашу конфигурацию
type Configuration struct { Port int Static_Variable string Connection_String string }
В нашем json-файле у нас есть json, описывающий ключ / значение нашей конфигурации:
{ "Port": 8080 "Static_Variable": "static" }
у нас также будет connection_string, но он будет в переменных окружения.
- Итак, нам нужно получить информацию из json:
//filename is the path to the json config file file, err := os.Open(filename) if err != nil { return err } decoder := json.NewDecoder(file) err = decoder.Decode(&configuration) if err != nil { return err }
- и из переменных среды
configuration.Connection_String = os.Getenv("Connection_String")
Если вы не хотите управлять им самостоятельно, вы можете использовать gonfig или viper.
используя gonfig
Гонфиг будет полезен:
- иметь статический контекст конфигурации, позволяющий иметь всю конфигурацию везде в вашем приложении.
- есть общий способ определить все переменные env в вашей структуре.
Итак, чтобы использовать gonfig:
$ go get github.com/tkanos/gonfig
тогда вам просто нужно определить свою структуру
type Configuration struct { Port int Static_Variable string Connection_String string }
и отправьте имя файла и структуру в gonfig:
configuration := Configuration{} err := gonfig.GetConf("path/to/myjonfile.json", &configuration)
Итак, теперь мы можем управлять конфигурацией, как если бы у нас был только один источник конфигурации.
fmt.Println(configuration.Port);
используя Viper
go get github.com/spf13/viper
В вашем коде вам нужно будет объявить свои переменные
var ( Port string )
Viper сможет читать в файле toml или в переменных env, поэтому, если вы хотите иметь файл конфигурации для своей среды разработки, но использовать переменные env для производства, вы можете написать такой код:
if os.Getenv("ENVIRONMENT") == "DEV" { viper.SetConfigName("config") viper.SetConfigType("toml") viper.AddConfigPath(filepath.Dir(dirname)) viper.ReadInConfig() } else { viper.AutomaticEnv() }
А затем инициализировать вашу переменную:
// To add a default value : viper.SetDefault("APP_PORT", "8080") //To get from the toml file or env var Port = viper.GetString("APP_PORT")