Конфигуратор | Четыре способа чтения файлов конфигурации среды в Go

задняя часть Go Google
Конфигуратор | Четыре способа чтения файлов конфигурации среды в Go

«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"

Файл конфигурации очень важен в проекте, особенно важно, как эффективно читать конфигурацию. Если вы не используете какую-либо стороннюю библиотеку, наиболее распространенным способом является получение содержимого файла через файловый ввод-вывод, но, в конце концов, я просто хочу прочитать файл конфигурации, который требует операций с файлами, т.е. немного колеса. Кроме того, существуют различные форматы файлов, и то, как читать содержимое файла в формате и читать его в соответствии с различными средами, также является большой проблемой. В этой статье я представляю четыре способа чтения файлов конфигурации, выберите в соответствии с вашими потребностями.

1. Введение в четыре метода чтения

Есть два выдающихся, в том числеViperа такжеGoDotEnv, аудитория этих двух методов достаточно широка,ViperсуществуетGithubВ лучшем случае звезда, более полный документ,GoDotEnvСледующий.另外还有两个比较小众轻量级的,包括gonfigа такжеgo-akka. Пожалуйста, обратитесь к отдельному введениюGithubпредставлять.

go-akka

Недоступен в данный момент! ! !

Карусель GitHub

godotenv(Available)

A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file)

Карусель GitHub

gonfig

gonfig is a lightweight Golang package for intergrating both JSON configs and enviornment variables into one config object.

Карусель GitHub

viper(Available,Most stars)

Viper is heading towards v2 and we would love to hear what you would like to see in it.

Карусель GitHub

Во-вторых, практика го-акка

конфигурационный файлconfig.yaml

port: 8081
debug: true

Разобрать конфигурациюconfig.go

import "github.com/go-akka/configuration"
​
type Config struct {
    Port  uint16 `yaml:"port"`
    Debug bool   `yaml:"debug"`
    Raw   *configuration.Config
}
​
func (c *Config) parseConfig(path string) *Config {
    c.Raw = configuration.LoadConfig(path)
    c.Port = uint16(c.Raw.GetInt32("port", 8008))
    c.Debug = c.Raw.GetBoolean("debug", false)
    return c
}

тестовое заданиеconfig_test.go

func TestConfig(t *testing.T) {
    assert.NotPanics(t, func() {
        cfg := new(Config).parseConfig("./cfg.yaml")
        fmt.Printf(" port=%d,debug=%t", cfg.Port, cfg.Debug)
    })
}

Три, годотенв практика

тестовый файл.env

Key1=value1
Key2 =value2

Разобрать конфигурациюconfig.go

func init() {
    if err := godotenv.Load("./.env"); err != nil {
        log.Fatal("Error loading .env file")
    }
}
​
func ReadEnv() {
    value1 := os.Getenv("Key1")
    value2 := os.Getenv("Key2")
    value3 := os.Getenv("Key3")
    if value1 == "" || value2 == "" {
        panic("load error")
    }
    fmt.Printf("key1=%s,key2=%s,key3=%s", value1, value2, value3)
}
​

тестовый файлconfig_test.go

func TestEnv(t *testing.T) {
    assert.NotPanics(t, func() {
        ReadEnv()
    })
}

В-четвертых, практика гонфига

конфигурационный файл

dev_config.json

{
    "DB_USERNAME": "test",
    "DB_PASSWORD": "test",
    "DB_PORT": "3306",
    "DB_HOST": "127.0.0.1",
    "DB_NAME": "test"
}

prd_config.json

{
    "DB_USERNAME": "prd_test",
    "DB_PASSWORD": "prd_test",
    "DB_PORT": "3306",
    "DB_HOST": "127.0.0.1",
    "DB_NAME": "prd_test"
}

Разбор конфигурацииconfig.go

type Configuration struct {
    DB_USERNAME string
    DB_PASSWORD string
    DB_PORT     string
    DB_HOST     string
    DB_NAME     string
}
​
func ParseConfig(params ...string) Configuration {
    configuration := Configuration{}
    env := "dev"
    if len(params) > 0 {
        env = params[0]
    }
    fName := fmt.Sprintf("./%s_config.json", env)
    if err := gonfig.GetConf(fName, &configuration); err != nil {
        panic(err)
    }
    return configuration
}

тестовый файлconfig_test.go

func TestConfig(t *testing.T) {
    assert.NotPanics(t, func() {
        fmt.Println("Dev Conf :")
        cfg := ParseConfig()
        fmt.Printf("userName=%s,password=%s,port=%s,host=%s,name=%s \n", cfg.DB_USERNAME, cfg.DB_PASSWORD, cfg.DB_PORT, cfg.DB_HOST, cfg.DB_NAME)
        cfg = ParseConfig("prd")
        fmt.Printf("userName=%s,password=%s,port=%s,host=%s,name=%s \n", cfg.DB_USERNAME, cfg.DB_PASSWORD, cfg.DB_PORT, cfg.DB_HOST, cfg.DB_NAME)
    })
​
}

Пять, змеиная практика

конфигурационный файлconfig.yml

server:
  port: 8080
​
database:
  dbname:
  dbuser: "dbuser"
  dbpassword: "dbpassword"
​
EXAMPLE_VAR: "variable from config.yml"
EXAMPLE_PATH: "path from config.yml"

Разобрать конфигурациюconfig.go

type Configurations struct {
    Server       ServerConfigurations
    Database     DatabaseConfigurations
    EXAMPLE_PATH string
    EXAMPLE_VAR  string
}
​
// ServerConfigurations exported
type ServerConfigurations struct {
    Port int
}
​
// DatabaseConfigurations exported
type DatabaseConfigurations struct {
    DBName     string
    DBUser     string
    DBPassword string
}
​
func readConfig() {
    viper.SetConfigName("config")
    viper.AddConfigPath(".")
    viper.AutomaticEnv()
    viper.SetConfigType("yml")
    var configuration Configurations
    if err := viper.ReadInConfig(); err != nil {
        fmt.Printf("Error reading config file, %s", err)
    }
    viper.SetDefault("database.dbname", "test_db")
    err := viper.Unmarshal(&configuration)
    if err != nil {
        fmt.Printf("Unable to decode into struct, %v", err)
    }
    fmt.Printf("reading using model:\n database=%s,port=%d,path=%s,var=%s \n",
        configuration.Database.DBName,
        configuration.Server.Port,
        configuration.EXAMPLE_PATH,
        configuration.EXAMPLE_VAR)
    fmt.Printf("reading without model:\n database=%s,port=%d,path=%s,var=%s \n",
        viper.GetString("database.dbname"),
        viper.GetInt("server.port"),
        viper.GetString("EXAMPLE_PATH"),
        viper.GetString("EXAMPLE_VAR"))
}

тестовый файлconfig_test.go

func TestConfig(t *testing.T) {
    assert.NotPanics(t, func() {
        readConfig()
    })
}

6. Резюме

Четыре способа конфигурации среды чтения следует выбирать в соответствии с их собственной ситуацией.Рекомендуется использовать производственную среду.viperа такжеgodotenv, ведь закаляться гораздо надежнее, да и напоминания дружеские естьНикогда не забуду.gitignoreвключите переменные среды в файл.

github repo


Брат, не паникуй! Не стесняйтесь оставлять лайки, обсуждать и комментировать. Добро пожаловать в колонку языка практикиgothing, учиться идти рука об руку. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.